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
Creare una libreria CSS universale: Cards
Utilizzare Locust con Azure Load Testing
Generare velocemente pagine CRUD in Blazor con QuickGrid
Creare un webhook in Azure DevOps
Collegare applicazioni server e client con .NET Aspire
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Usare le navigation property in QuickGrid di Blazor
Ricevere notifiche sui test con Azure Load Testing
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Loggare le query più lente con Entity Framework
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
I più letti di oggi
- Parallelizzare le chiamate HTTP con async/await e le Promise in JavaScript
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- a #RealCodeConf4 il 25 maggio a Firenze parleremo di #silverlight4. iscrizioni gratis su http://u.aspitalia.com/g9
- Eseguire una chiamata AJAX per inviare dati al server in Angular 2
- Comporre la pagina HTML con i nuovi tag semantici di HTML5