Entity Framework - Transakcja

We wszystkich wersjach Entity Framework, za każdym razem, gdy wykonujesz SaveChanges()aby wstawić, zaktualizować lub usunąć bazę danych, platforma otoczy tę operację transakcją. Po wywołaniu SaveChanges kontekst automatycznie rozpoczyna transakcję i zatwierdza ją lub wycofuje w zależności od tego, czy utrwalenie powiodło się.

  • To wszystko jest dla ciebie przejrzyste i nigdy nie będziesz musiał sobie z tym radzić.

  • Ta transakcja trwa tylko wystarczająco długo, aby wykonać operację, a następnie zostaje zakończona.

  • Kiedy wykonasz kolejną taką operację, rozpocznie się nowa transakcja.

Entity Framework 6 zapewnia następujące -

Database.BeginTransaction ()

  • Jest to prosta i łatwiejsza metoda w ramach istniejącego DbContext do uruchamiania i kończenia transakcji dla użytkowników.

  • Umożliwia połączenie kilku operacji w ramach tej samej transakcji, a zatem wszystkie są zatwierdzane lub wszystkie są wycofywane jako jedna.

  • Umożliwia również użytkownikowi łatwiejsze określenie poziomu izolacji transakcji.

Database.UseTransaction ()

  • Pozwala DbContext na użycie transakcji, która została uruchomiona poza Entity Framework.

Przyjrzyjmy się poniższemu przykładowi, w którym wiele operacji jest wykonywanych w jednej transakcji. Kod jest następujący -

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();
            }

         }
      }
   }
}
  • Rozpoczęcie transakcji wymaga, aby podstawowe połączenie ze sklepem było otwarte.

  • Dlatego wywołanie Database.BeginTransaction () otworzy połączenie, jeśli nie zostało jeszcze otwarte.

  • Jeśli DbContextTransaction otworzy połączenie, zamknie je po wywołaniu metody Dispose ().