Olá, Rodrigo
Eu proporia uma abordagem usando código .NET puro. Imagine que você precise rastrear a data de criação e a data de última atualização de todas as entidades do seu sistema.
Para isso, você pode criar uma interface com essas duas datas, assim:
public interface ITracking
{
DateTime Created { get; set; }
DateTime LastUpdated { get; set; }
}
A seguir, você teria que implementar essa interface em todas as entidades onde quer controlar a data de criação e atualização.
public class Livro : ITracking
{
public int LivroId { get; set; }
[MaxLength(150)]
public string Titulo { get; set; }
public string Autor { get; set; }
DateTime Created { get; set; }
DateTime LastUpdated { get; set; }
}
Então você poderia modificar sua classe de contexto para sobrescrever (override) os métodos:
SaveChanges()SaveChangesAsync()
Assim, você teria como garantir que as entidades que estão sendo gravadas terão suas datas de criação/atualização modificadas
pelo método OnBeforeSaving():
public class LivrariaContext : DbContext
{
public DbSet<Livro> Livros { get; set; }
public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
OnBeforeSaving();
return base.SaveChanges(acceptAllChangesOnSuccess);
}
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
OnBeforeSaving();
return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
private void OnBeforeSaving()
{
var entries = ChangeTracker.Entries();
foreach (var entry in entries)
{
if (entry.Entity is ITracking tracked)
{
switch (entry.State)
{
case EntityState.Modified:
tracked.LastUpdated = DateTime.UtcNow;
break;
case EntityState.Added:
tracked.Created =
tracked.LastUpdated = DateTime.UtcNow;
break;
}
}
}
}
}
Perceba que o método OnBeforeSaving() varre as entidades modificadas e, para cada entidade que implementa a interface
ITracking que criamos:
- Inicializa as propriedades
Created e LastUpdated com a data e hora atuais se um novo regitro está sendo criado no banco de dados - Atualiza a propriedade
LastUpdated com a data e hora atuais se um regitro está sendo atualizado no banco de dados
Note que você pode mover esses métodos adicionais que criamos na classe LivrariaContext para uma classe-base,
que pode ser reaproveitada em outros projetos. Assim, sua classe de contexto ficará mais limpa e legível.