Entity Framework - Transazione

In tutte le versioni di Entity Framework, ogni volta che esegui SaveChanges()per inserire, aggiornare o eliminare il database, il framework avvolgerà tale operazione in una transazione. Quando si richiama SaveChanges, il contesto avvia automaticamente una transazione e la esegue il commit o il rollback a seconda che la persistenza sia riuscita.

  • Tutto questo è trasparente per te e non avrai mai bisogno di affrontarlo.

  • Questa transazione dura solo il tempo necessario per eseguire l'operazione e quindi viene completata.

  • Quando si esegue un'altra operazione simile, inizia una nuova transazione.

Entity Framework 6 fornisce quanto segue:

Database.BeginTransaction ()

  • È un metodo semplice e più semplice all'interno di un DbContext esistente per avviare e completare le transazioni per gli utenti.

  • Consente di combinare più operazioni all'interno della stessa transazione e quindi viene eseguito il commit o il rollback di tutte.

  • Consente inoltre all'utente di specificare più facilmente il livello di isolamento per la transazione.

Database.UseTransaction ()

  • Consente a DbContext di utilizzare una transazione avviata all'esterno di Entity Framework.

Diamo uno sguardo al seguente esempio in cui più operazioni vengono eseguite in una singola transazione. Il codice è come -

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         using (var dbContextTransaction = context.Database.BeginTransaction()) {

            try {

               Student student = new Student() {
                  ID = 200, 
                  FirstMidName = "Ali", 
                  LastName = "Khan", 
                  EnrollmentDate = DateTime.Parse("2015-12-1")
               };

               context.Students.Add(student);

               context.Database.ExecuteSqlCommand(@"UPDATE Course SET Title = 
                  'Calculus'" + "WHERE CourseID = 1045");

               var query = context.Courses.Where(c ⇒ c.CourseID == 1045);

               foreach (var item in query) {
                  Console.WriteLine(item.CourseID.ToString()
                     + " " + item.Title + " " + item.Credits);
               }

               context.SaveChanges();
               var query1 = context.Students.Where(s ⇒ s.ID == 200);

               foreach (var item in query1) {
                  Console.WriteLine(item.ID.ToString() 
                     + " " + item.FirstMidName + " " + item.LastName);
               }

               dbContextTransaction.Commit();
            } catch (Exception) {
               dbContextTransaction.Rollback();
            }

         }
      }
   }
}
  • L'inizio di una transazione richiede che la connessione del negozio sottostante sia aperta.

  • Quindi chiamare Database.BeginTransaction () aprirà la connessione, se non è già aperta.

  • Se DbContextTransaction ha aperto la connessione, la chiuderà quando viene chiamato Dispose ().