Tenere traccia di tutte le modifiche ai dati con Entity Framework Core

di Stefano Mostarda, in LINQ, Entity Framework,

Una delle richieste più comuni dei progetti è quella di avere a disposizione un log dei cambiamenti dei dati, di chi li ha fatti e quando. A seconda delle esigenze, questa operaione può essere estremamente semplice o complicata. In questo script prendiamo in esame un caso semplice in quando lo scenario complicato dipende dai singoli casi.
Quando dobbiamo creare un log, la prima cosa da fare è creare la classe che conterrà i log è mapparla nel context.

public class Log
{
  public int Id { get; set; }
  public string AccountId { get; set; }
  public string EntityType { get; set; }
  public DateTimeOffset EventTimestamp { get; set; }
  public string Entity { get; set; }
}

public class MyContext : DbContext
{
  public DbSet<AuditTrail> Trails { get; set; }

}

La classe Log contiene l'utente che ha fatto la modifica, il tipo dell'entity, la data e l'entity serializzata in JSON.
La seconda cosa da fare è intercettare tutte le modifiche ai dati e salvarle nella tabella di log. In questi casi dobbiamo eseguire l'override del metodo SaveChanges, intercettare le entity aggiunte, modificate ed eliminate, creare un oggetto Log per ognuna di queste e persistere tutto insieme.

public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
  var entries = ChangeTracker.Entries().Where(e => e.State != EntityState.Unchanged);

  foreach (var entry in entries.ToList())
  {
    var audit = new Log
    {
      EntityType = entry.Entity.GetType().Name,
      EventTimestamp = DateTimeOffset.UtcNow,
      EventDataDetails = JsonConvert.SerializeObject(changeDetails, SerializerSettings),
      AccountId = ClaimsPrincipal.Current.Identity.Name
    };
    Trails.Add(audit);
  }
  return base.SaveChanges(acceptAllChangesOnSuccess)
}


Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi