Quando con la versione 6 di EF Core utilizziamo il metodo SaveChanges o la sua controparte asincrona, EF Core 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 loggassimo i comandi inviati al database, noteremmo 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 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 verranno più generati ottimizzando le performance. Il risultato è che il seguente codice genra un solo comando SQL.
using var ctx = new MyContext(); ctx.Customers.Add(customer); ctx.SaveChanges();
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Ricevere notifiche sui test con Azure Load Testing
Disabilitare automaticamente un workflow di GitHub (parte 2)
Introduzione alle Container Queries
Utilizzare QuickGrid di Blazor con Entity Framework
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Supportare la sessione affinity di Azure App Service con Application Gateway
Simulare Azure Cosmos DB in locale con Docker
Utilizzare Azure Cosmos DB con i vettori
La gestione della riconnessione al server di Blazor in .NET 9
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Generare una User Delegation SAS in .NET per Azure Blob Storage