Ottimizzare la persistenza che coinvolge un solo oggetto con Entity Framework Core 7

di Stefano Mostarda, in LINQ, Entity Framework,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi