在所有版本的Entity Framework中,每当执行 SaveChanges()以插入,更新或删除数据库时,框架都会将该操作包装在事务中.当您调用SaveChanges时,上下文会自动启动一个事务并根据持久性是否成功提交或回滚它.
这对您来说都是透明的,您永远不需要处理它.
此事务只持续足够长的时间来执行操作然后完成.
当您执行另一个此类操作时,将启动一个新事务.
实体框架6提供以下 :
在现有的DbContext中,这是一种简单易用的方法,可以为用户启动和完成事务.
它允许在同一个操作中组合多个操作事务,因此要么全部都已提交,要么全部作为一个回滚.
它还允许用户更轻松地指定事务的隔离级别./p>
它允许使用事务的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()时它将关闭它.