EntityFramework,TransactionScope和SaveChanges

4
我正在处理一个使用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。我尝试在两个 SaveChanges 之间抛出异常,但它没有回滚第一个调用的修改。

为什么要使用 TransactionScope

谢谢

3个回答

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
你为什么要使用BeginTransaction而不是新的TransactionScope?还有指定的隔离级别呢? - Neb

3
这应该可以为您解释 - https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/ 编辑:根据szer的要求。
这个链接的关键是:
“If you call SaveChanges() or SaveChanges(true), the EF simply assumes that if its work completes okay, everything is okay, so it will discard the changes it has been tracking, and wait for new changes.”

3
就像Marc解释的那样,你需要回滚TransactionScope而不是EF上下文事务。TransactionScope创建一个环境事务,操作可以加入其中。所以你在这里做的就是创建一个包含多个事务的事务,可以一次性提交或回滚它们。
你代码中发生的事情如下所示: 1. 你提交查询1(用SaveChanges调用)。 2. 你提交查询2(用SaveChanges调用)。 3. 发生错误。 4. 你回滚最新的事务(查询2)。请注意,查询1仍然被提交。 5. 你提交环境事务,"保存"结果。这意味着最终结果是查询1已经提交,查询2已经回滚。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接