EntityFramework, TransactionScope and SaveChange

本文关键字:SaveChange and TransactionScope EntityFramework | 更新日期: 2023-09-27 18:37:09

我正在使用EntityFramework开发一个c#项目,最后一位开发人员写道:

using (System.Transactions.TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
    try
    {
        //... do somehting
        context.SaveChanges();
        //... do some other work
        context.SaveChanges();
        scope.Complete();
    }
    catch (Exception ex)
    {
       context.RollbackChanges();
       scope.Complete();
    }
}

我不明白他为什么要使用TransactionScope.我试图在 2 SaveChanges之间抛出异常,但它没有回滚第一次调用修改。

为什么要使用TransactionScope

谢谢

EntityFramework, TransactionScope and SaveChange

这应该为您解释 - https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

编辑:根据szer的要求。

他们从链接中得出的关键要点是:

"如果调用 SaveChanges() 或 SaveChanges(true),EF 只是假设如果它的工作完成正常,则一切正常,因此它将放弃它一直在跟踪的更改,并等待新的更改。

您需要在 scope 对象上调用 Rollback() 方法。若要创建作用域,请调用 context.Database.BeginTransaction()

using (var scope = context.Database.BeginTransaction()) 
{ 
    try 
    { 
        // do some stuff 
        context.SaveChanges(); 
        // do other stuff 
        context.SaveChanges(); 
        scope.Commit(); 
    } 
    catch (Exception) 
    { 
        scope.Rollback(); 
    } 
} 

就像 Marc 解释的那样,您需要回滚TransactionScope,而不是 EF 上下文事务。 TransactionScope创建操作可以登记的环境事务。因此,您在这里要做的是创建一个事务,该事务包装多个事务,并且可以一次提交或回滚所有事务。

代码中发生的事情是这样的:

  1. 您正在提交查询 1(使用 SaveChanges 调用)。
  2. 您正在提交查询 2(使用 SaveChanges 调用)。
  3. 发生错误。
  4. 要回滚最新事务(查询 2)。请注意,查询 1 仍已提交。
  5. 您正在提交环境事务,"保存"结果。这意味着最终结果是查询 1 已提交,查询 2 已回滚。