In molti script presenti su questo sito, abbiamo visto che per eseguire operazioni prima e dopo il salvataggio dei dati (ad esempio per scopi di logging) dobbiamo eseguire l'override del metodo SaveChanges ed eseguire codice prima e dopo la chiamata al metodo base.
A partire dalla versione 5 di Entity Framework Core, possiamo evitare di alterare la classe che eredita da DbContext e ricorrere agli eventi che internamente il Savechanges metodo solleva. Gli eventi sono:
- SavingChanges: sollevato all'inizio del metodo SaveChanges quindi prima che le entity vengano persistite;
- SavedChanges: sollevato alla fine del metodo SaveChanges quindi dopo che le entity sono state salvate;
- SaveChangesFailed: sollevato in caso la persistenza vada in errore.
Il metodo che gestisce uno di questi eventi accetta in input il sender (che rappresenta il contesto) e un oggetto il cui tipo che cambia a seconda dell'evento:
- SavingChangesEventArgs: in input al metodo che gestisce l'evento SavingChanges. Non offre informazioni aggiuntive;
- SavedChangesEventArgs: in input al metodo che gestisce l'evento SavedChanges. Contiene una proprietà che specifica quanti record sono stati scritti;
- SaveChangesFailedEventArgs: in input al metodo che gestisce l'evento SaveChangesFailed. Contiene una proprietà che specifica l'eccezione sollevata in fase di persistenza.
Queste classi ereditano da una classe base che contiene solo la proprietà AcceptAllChangesOnSuccess.
var context = new MyContext(); context.SavingChanges += (sender, args) => Console.Write("Saving changes"); context.SavedChanges += (sender, args) => Console.Write($"{args.EntitiesSavedCount} Changes saved"); context.SaveChangesFailed += (sender, args) => Console.Write($"SaveChanges failed with exception {args.Exception.Message}");
Eseguire l'override di SaveChanges è indubbiamente più comodo rispetto al sottoscriversi agli eventi. Tuttavia non sempre abbiamo a disposizione la possibilità di modificare il codice della clase di contesto. In questi scenari gli eventi ci consentono di poter applicare comunque la nostra logica.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Utilizzare WhenEach per processare i risultati di una lista di task
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Ordine e importanza per @layer in CSS
Generare una User Delegation SAS in .NET per Azure Blob Storage
Gestione ciclo di vita in .NET Aspire
Utilizzare WebJobs su Linux con Azure App Service
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Collegare applicazioni server e client con .NET Aspire
Centralizzare gli endpoint AI Foundry con Azure API Management
Introduzione ai web component HTML
Ottimizzare le pull con Artifact Cache di Azure Container Registry
I più letti di oggi
- disponibile il nuovo #adsdk per #win8. doc su https://aspit.co/ad3 donwload diretto da https://aspit.co/ad4
- Niente .NET sui server: siamo Microsoft
- Develop and distribute Azure Functions using K8s and CI/CD
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9
- Impersonation di utente per l'esecuzione di codice in una pagina ASP.NET
- Solo 5 minuti all'inizio della keynote!! http://aspitalia.com/build-win8 #BldWin
- #MIX10: Windows Phone - demo Hush Hush, un diario con interfaccia completamente personalizzata