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
Gestire la cancellazione di una richiesta in streaming da Blazor
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Escludere alcuni file da GitHub Secret Scanning
Documentare i servizi REST con Swagger e OpenAPI con .NET 9
Creare una libreria CSS universale: Immagini
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
La gestione della riconnessione al server di Blazor in .NET 9
Triggerare una pipeline su un altro repository di Azure DevOps
Configurare lo startup di applicazioni server e client con .NET Aspire
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Gestione file Javascript in Blazor con .NET 9
Effettuare il refresh dei dati di una QuickGrid di Blazor
I più letti di oggi
- Formati per l'impostazione del colore in CSS3
- Eseguire una chiamata AJAX per inviare dati al server in Angular 2
- Impostare un riferimento ad una entity collegata tramite foreign key
- la Call For Papert per #netconfit è aperta!invia la tua sessione da https://aspit.co/netconfit-20 puoi parlare di #net5, #aspnet5, #efcore5, #CSharp9 e tutto quello che ruota intorno a #dotnet.