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
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Miglioramenti nell'accessibilità con Angular CDK
Gestione dell'annidamento delle regole dei layer in CSS
Utilizzare database e servizi con gli add-on di Container App
Utilizzare Tailwind CSS all'interno di React: primi componenti
Gestione dei nomi con le regole @layer in CSS
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Change tracking e composition in Entity Framework
Gestire la cancellazione di una richiesta in streaming da Blazor
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Le novità di Angular: i miglioramenti alla CLI
I più letti di oggi
- Visual Basic 2010 - Espresso
- Pubblicare su Azure Functions con Visual Studio Team Services
- Impostare le regole di autorizzazione in un'area di ASP.NET MVC
- Ricavare lo spazio occupato su disco dal nostro sito
- Migliorare l'organizzazione delle risorse con Azure Policy
- Eseguire query LINQ su liste non generiche con l'operatore Cast
- Modificare il timezone di un device IoT con la Universal Windows Platform
- Disponibili la Release Preview di Windows 8 e la Release Candidate di Visual Studio 2012
- Scegliere tra le versioni Current ed LTS di ASP.NET Core
- Mostrare tutti i campi di una tabella