📅  最后修改于: 2020-11-21 07:20:00             🧑  作者: Mango
在Entity Framework的所有版本中,每当执行SaveChanges()来插入,更新或删除数据库时,该框架都会将该操作包装在事务中。当您调用SaveChanges时,上下文将自动启动事务并根据持久性是否成功进行提交或回滚。
这对您来说都是透明的,并且您将不需要处理它。
此事务仅持续很长时间以执行操作,然后完成。
当您执行另一个这样的操作时,新的事务开始。
实体框架6提供以下内容-
这是在现有DbContext中为用户启动和完成事务的一种简单便捷的方法。
它允许将多个操作合并到同一事务中,因此可以全部提交或全部回滚为一个。
它还允许用户更轻松地指定事务的隔离级别。
它允许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()时它将关闭连接。