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 ().