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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire una query su SQL Azure tramite un workflow di GitHub
Elencare le container images installate in un cluster di Kubernetes
Load test di ASP.NET Core con k6
Utilizzare Tailwind CSS all'interno di React: installazione
Eseguire attività basate su eventi con Azure Container Jobs
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Limitare le richieste lato server con l'interactive routing di Blazor 8
Copiare automaticamente le secret tra più repository di GitHub
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
Usare una container image come runner di GitHub Actions