- 實體框架教程
- 實體框架 - 首頁
- 實體框架 - 概述
- 實體框架 - 架構
- 實體框架 - 環境設定
- 實體框架 - 資料庫設定
- 實體框架 - 資料模型
- 實體框架 - DbContext
- 實體框架 - 型別
- 實體框架 - 關係
- 實體框架 - 生命週期
- 實體框架 - 程式碼優先方法
- 實體框架 - 模型優先方法
- 實體框架 - 資料庫優先方法
- 實體框架 - 開發方法
- 實體框架 - 資料庫操作
- 實體框架 - 併發
- 實體框架 - 事務
- 實體框架 - 檢視
- 實體框架 - 索引
- 實體框架 - 儲存過程
- 實體框架 - 斷開連線的實體
- 實體框架 - 表值函式
- 實體框架 - 本機SQL
- 實體框架 - 列舉支援
- 實體框架 - 非同步查詢
- 實體框架 - 永續性
- 實體框架 - 投影查詢
- 實體框架 - 命令日誌
- 實體框架 - 命令攔截
- 實體框架 - 空間資料型別
- 實體框架 - 繼承
- 實體框架 - 遷移
- 實體框架 - 渴望載入
- 實體框架 - 延遲載入
- 實體框架 - 顯式載入
- 實體框架 - 驗證
- 實體框架 - 跟蹤更改
- 實體框架 - 彩色實體
- 實體框架 - 程式碼優先方法
- 實體框架 - 第一個示例
- 實體框架 - 資料註釋
- 實體框架 - Fluent API
- 實體框架 - 種子資料庫
- 實體框架 - 程式碼優先遷移
- 實體框架 - 多個DbContext
- 實體框架 - 巢狀實體型別
- 實體框架資源
- 實體框架 - 快速指南
- 實體框架 - 有用資源
- 實體框架 - 討論
實體框架 - 事務
在所有版本的實體框架中,每當你執行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() 時將關閉它。
廣告