Entity Framework - Transaktion

In allen Versionen von Entity Framework, wann immer Sie ausführen SaveChanges()Um die Datenbank einzufügen, zu aktualisieren oder zu löschen, wird diese Operation vom Framework in eine Transaktion eingeschlossen. Wenn Sie SaveChanges aufrufen, startet der Kontext automatisch eine Transaktion und schreibt sie fest oder setzt sie zurück, je nachdem, ob die Persistenz erfolgreich war.

  • Dies ist alles für Sie transparent und Sie müssen sich nie damit befassen.

  • Diese Transaktion dauert nur lange genug, um den Vorgang auszuführen, und wird dann abgeschlossen.

  • Wenn Sie eine andere solche Operation ausführen, wird eine neue Transaktion gestartet.

Entity Framework 6 bietet Folgendes:

Database.BeginTransaction ()

  • Es ist eine einfache und einfachere Methode innerhalb eines vorhandenen DbContext, Transaktionen für Benutzer zu starten und abzuschließen.

  • Es ermöglicht die Kombination mehrerer Vorgänge innerhalb derselben Transaktion, sodass entweder alle festgeschrieben oder alle als eine zurückgesetzt werden.

  • Außerdem kann der Benutzer die Isolationsstufe für die Transaktion einfacher festlegen.

Database.UseTransaction ()

  • Damit kann der DbContext eine Transaktion verwenden, die außerhalb des Entity Framework gestartet wurde.

Schauen wir uns das folgende Beispiel an, in dem mehrere Vorgänge in einer einzigen Transaktion ausgeführt werden. Der Code lautet wie folgt:

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

         }
      }
   }
}
  • Zum Starten einer Transaktion muss die zugrunde liegende Geschäftsverbindung geöffnet sein.

  • Wenn Sie also Database.BeginTransaction () aufrufen, wird die Verbindung geöffnet, sofern sie noch nicht geöffnet ist.

  • Wenn DbContextTransaction die Verbindung geöffnet hat, wird sie geschlossen, wenn Dispose () aufgerufen wird.