EntityFramework,TransactionScope和SaveChange

时间:2016-03-03 14:38:21

标签: c# entity-framework

我正在使用 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

由于

3 个答案:

答案 0 :(得分:3)

您需要在范围对象上调用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(); 
    } 
} 

答案 1 :(得分:2)

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

编辑:根据szer的要求。

他们从链接的关键点是:

"如果你调用SaveChanges()或SaveChanges(true),EF只会假设如果它的工作完成正常,一切正常,所以它会丢弃它一直在跟踪的更改,并等待新的更改"

答案 2 :(得分:2)

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

您的代码中发生了什么:

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