Библиотека Monq.Core.DbModelTracking
Библиотека содержит набор классов для логирования пользовательских действий в БД
Установка
Install-Package Monq.Core.DbModelTracking
Использование
-
Для модели, для которой необходимо произвести логирование, требуется реализовать интерфейс
ITrackableEntity
. -
В контексте базы данных к сущности, для которой необходимо произвести логирование, требуется произвести конфигурацию через
OwnsOne()
.
modelBuilder.Entity<TestEntity>(entity =>
{
...
entity.OwnsOne(x => x.EntityInfo).WithOwner();
});
-
Требуется провести соответствующую миграцию.
-
В модель представления требуется добавить свойство с типом
TrackedEntityViewModel
.
public class TestEntityViewModel
{
...
public TrackedEntityViewModel EntityInfo { get; set; }
}
- Необходимо также добавить конфигурацию
TrackedEntityProfile
дляAutoMapper
services.AddAutoMapper(typeof(Startup), typeof(TrackedEntityProfile));
- В проекте 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
, текущий пользователь.