M

Monq.Core.DbModelTracking

Библиотека Monq.Core.DbModelTracking

Библиотека содержит набор классов для логирования пользовательских действий в БД

Установка

Install-Package Monq.Core.DbModelTracking

Использование

  1. Для модели, для которой необходимо произвести логирование, требуется реализовать интерфейс ITrackableEntity.

  2. В контексте базы данных к сущности, для которой необходимо произвести логирование, требуется произвести конфигурацию через OwnsOne().

modelBuilder.Entity<TestEntity>(entity =>
            {                
                ...
                entity.OwnsOne(x => x.EntityInfo).WithOwner();
            });
  1. Требуется провести соответствующую миграцию.

  2. В модель представления требуется добавить свойство с типом TrackedEntityViewModel.

public class TestEntityViewModel
{
    ...
    public TrackedEntityViewModel EntityInfo { get; set; }
}
  1. Необходимо также добавить конфигурацию TrackedEntityProfile для AutoMapper
services.AddAutoMapper(typeof(Startup), typeof(TrackedEntityProfile));
  1. В проекте AsyncEvents для обработчика удаления пользователя необходимо занулять свойства CreatedBy и UpdatedBy, если их значение совпадает со значением идентификатора удаляемого пользователя.

Пример:

void SetNullUser(long userId)
{
    var testEntities = await _context
        .TestEntities
        .Where(x => x.EntityInfo.CreatedBy == userId || x.EntityInfo.UpdatedBy == userId)
        .ToListAsync();

    foreach (var testEntity in testEntities)
    {
        if (testEntity.EntityInfo.CreatedBy == userId)
            testEntity.EntityInfo.CreatedBy = null;

        if (testEntity.EntityInfo.UpdatedBy == userId)
            testEntity.EntityInfo.UpdatedBy = null;
    }
}

Реализуемые методы расширения

CreateEntityInfo(ClaimsPrincipal user)

Для создания мета-информации по сущности используется расширение CreateEntityInfo(ClaimsPrincipal user).

Данное расширение создает мета-информацию по сущности и заполняет поля с информацией о создателе и времени создания.

Пример:

[Route("api/test")]
public class TestController : Controller
{
    [HttpGet]
    public async Task<IActionResult> Post(TestEntityViewModel value)
    {
        ...
        testEntity.CreateEntityInfo(User);
        ...
    }
}

Аргументы:

  • User -- объект класса ClaimsPrincipal, текущий пользователь.

UpdateEntityInfo(ClaimsPrincipal user)

Для обновления мета-информации по сущности используется расширение UpdateEntityInfo(ClaimsPrincipal user)

Данное обновляет поля с информацией о пользователе, сделавшем обновление, и времени обновления.

Пример:

[Route("api/test")]
public class TestController : Controller
{
    [HttpGet]
    public async Task<IActionResult> Update(long id, TestEntityViewModel value)
    {
        ...
        testEntity.UpdateEntityInfo(User);
        ...
    }
}

Аргументы:

  • User -- объект класса ClaimsPrincipal, текущий пользователь.