Я столкнулся с чем-то вроде этой ситуации. Мое решение выглядит следующим образом:
1 - Получить информацию о пользователе на контроллере и передать эту информацию вашему объекту dto (request).
Я пишу расширения для получения идентификатора пользователя:
public static string GetUserId(this HttpContext httpContext)
{
return httpContext?.User?.Claims?.FirstOrDefault(claim => claim.Type == ClaimTypes.NameIdentifier)?.Value ?? string.Empty;
}
Объект запроса:
public class CreateMenuRequest
{
public string MenuName { get; set; }
[JsonIgnore]
public string UpdatedBy { get; set; }
}
2- Установить информацию о пользователе в объект запроса
Контроллер:
[HttpPost, Route("")]
public IActionResult CreateMenu([FromBody] CreateMenuRequest createMenuRequest)
{
if (createMenuRequest != null)
{
createMenuRequest.UpdatedBy = HttpContext.GetUserId();
}
CreateMenuResponse createMenuResponse = _menuService.CreateMenu(createMenuRequest);
return StatusCode(HttpStatusCode.Created.ToInt(), createMenuResponse);
}
3 - В слое обслуживания после проверки и других бизнес-требований я сопоставляю запрос с объектом. Объект сущности такой:
public class Menu : IAudit, ISoftDeletable
{
public long Id { get; set; }
..........
public string UpdatedBy { get; set; }
public DateTime UpdateDate { get; set; }
public string CreatedBy { get; set; }
public DateTime CreateDate { get; set; }
public bool IsDeleted { get; set; }
}
4 - переопределить SaveChanges для редактирования UpdateDate и CreatedDate, также, если элемент добавлен, информация обновляется в поле CreatedBy.
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
IEnumerable<EntityEntry> deletedEntities = ChangeTracker.Entries()
.Where(t => t.State == EntityState.Deleted && t.Entity is ISof
foreach (EntityEntry deletedEntity in deletedEntities)
{
if (!(deletedEntity.Entity is ISoftDeletable item)) continue;
item.IsDeleted = true;
deletedEntity.State = EntityState.Modified;
}
IEnumerable<object> addedEntities = ChangeTracker.Entries()
.Where(t => t.State == EntityState.Added && t.Entity is IAudit)
.Select(t => t.Entity);
IEnumerable<object> modifiedEntities = ChangeTracker.Entries()
.Where(t => t.State == EntityState.Modified && t.Entity is IAudit)
.Select(t => t.Entity);
DateTime now = DateTime.UtcNow;
Parallel.ForEach(addedEntities, o =>
{
if (!(o is IAudit item))
return;
item.CreateDate = now;
item.UpdateDate = now;
item.CreatedBy = item.UpdatedBy;
});
Parallel.ForEach(modifiedEntities, o =>
{
if (!(o is IAudit item))
return;
item.UpdateDate = now;
});
return base.SaveChanges();
}