Quando utilizziamo il metodo SaveChanges o la sua controparte asincrona, EF genera automaticamente una transazione ed esegue i comandi all'interno di essa. Prendiamo come esempio il seguente codice.
using var ctx = new MyContext(); ctx.Customers.Add(customer); ctx.Orders.Add(order); ctx.Logs.Add(log); ctx.SaveChanges();
Se osserviamo la lista di comandi inviati al database notiamo che il primo comando è "Begin Transaction", seguito dai comandi per inserire i tre record seguiti a loro volta dal comando "Commit Transaction" o "Rollback Transaction" rispettivamente se i comandi precedenti sono stati eseguiti correttamente o meno.
Quando dobbiamo eseguire comandi multipli (ad esempio aggiornare più tabelle o inserire più record), l'utilizzo di una transazione è necessario, ma quando dobbiamo eseguire un solo comando, la situazione cambia. Quando dobbiamo persistere un solo oggetto e quindi generare un solo comando, il database gestisce autonomamente la transazione e EF può quindi evitare di crearne una esplicitamente risparmiando ben due round-trip con il database (uno per iniziare la transazione e uno per completarla).
Per questo motivo, a partire da EF 7, quando si deve persistere un solo oggetto, i comandi per gestire la transazione non vengono più generati ottimizzando le performance.
using var ctx = new MyContext(); ctx.Customers.Add(customer); ctx.SaveChanges(); //non esegue i comandi per la transazione
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Scrivere selettori CSS più semplici ed efficienti con :is()
Fornire parametri ad un Web component HTML
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Anonimizzare i dati sensibili nei log di Azure Front Door
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Selettore CSS :has() e i suoi casi d'uso avanzati
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Gestione degli eventi nei Web component HTML
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Implementare l'infinite scroll con QuickGrid in Blazor Server
Estrarre dati randomici da una lista di oggetti in C#