实体框架 – 交易
实体框架 – 交易
在实体框架的所有版本中,每当您执行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() 时关闭它。