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
Usare il versioning con i controller di ASP.NET Core Web API
Creazione di componenti personalizzati in React.js con Tailwind CSS
Utilizzare la libreria Benchmark.NET per misurare le performance
Eseguire query verso tipi non mappati in Entity Framework Core
Gestire i null nelle reactive form tipizzate di Angular
Utilizzare i primary constructor in C#
Routing statico e PreRendering in una Blazor Web App
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Installare le Web App site extension tramite una pipeline di Azure DevOps
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Miglioramenti nelle performance di Angular 16
I più letti di oggi
- Riordinare le righe di una GridView di ASP.NET con jQuery
- Creazione di un alarm con suono personalizzato con Windows Phone 7.1
- Utilizzare la session affinity con Azure Container Apps
- Blue-green deployment con Azure Web App e DevOps
- Ed infine anche il calendario :)
- Configurare la diagnostica di Azure attraverso Visual Studio
- Recuperare la data di creazione di un tag tramite una pipeline YAML di Azure DevOps
- Microsoft Security Bulletin MS05-002
- .NET Core e dispositivi IoT
- Eseguire attività pianificate con Azure Container Jobs