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.