實體框架 - 事務



在所有版本的實體框架中,每當你執行SaveChanges()來插入、更新或刪除資料庫時,框架都會將該操作包裝在一個事務中。當你呼叫 SaveChanges 時,上下文會自動啟動一個事務,並根據持久化是否成功來提交或回滾它。

  • 這一切對你來說都是透明的,你永遠不需要處理它。

  • 此事務僅持續足夠長的時間來執行操作,然後完成。

  • 當你執行另一個此類操作時,將啟動一個新事務。

實體框架 6 提供以下內容 -

Database.BeginTransaction()

  • 它是在現有 DbContext 中啟動和完成使用者事務的一種簡單易用的方法。

  • 它允許在同一個事務中組合多個操作,因此要麼全部提交,要麼全部回滾為一個。

  • 它還允許使用者更輕鬆地為事務指定隔離級別。

Database.UseTransaction()

  • 它允許 DbContext 使用在實體框架外部啟動的事務。

讓我們看一下以下示例,其中在單個事務中執行多個操作。程式碼如下 -

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

         }
      }
   }
}
  • 啟動事務需要底層儲存連線處於開啟狀態。

  • 因此,呼叫 Database.BeginTransaction() 將開啟連線(如果尚未開啟)。

  • 如果 DbContextTransaction 打開了連線,則在呼叫 Dispose() 時將關閉它。

廣告
© . All rights reserved.