.net 使用事务作用域的实体框架回滚

.net 使用事务作用域的实体框架回滚,.net,entity-framework,dynamics-crm,dynamics-crm-2011,transactionscope,.net,Entity Framework,Dynamics Crm,Dynamics Crm 2011,Transactionscope,我试图创建一个方法,使用实体框架和事务范围将多个更新链接到数据库。我希望能够在验证错误/异常的情况下进行回滚。我的设置如下: using (TransactionScope scope = new TransactionScope()) { try{ SomeBusinessLogic(); RepoMethod1(); Throw random Exception here; RepoMethod2(); cat

我试图创建一个方法,使用实体框架和事务范围将多个更新链接到数据库。我希望能够在验证错误/异常的情况下进行回滚。我的设置如下:

using (TransactionScope scope = new TransactionScope())
{
    try{
        SomeBusinessLogic(); 
        RepoMethod1();
        Throw random Exception here;
        RepoMethod2();
    catch(Exception ex){
        Transaction.Current.Rollback();
        scope.Dispose();
        return;
    }
}
public RepoMethod1(){
    using (MyContext context = new MyContext())
    {
        DoSomeWork();
        context.SaveChanges();
    }
}
不幸的是,若抛出异常,则不会发生回滚。 但它应该,不是吗

编辑


所以,我的问题似乎源于我通过实体框架使用CRM Dynamics。这在与常规EF一起使用时有效,但在与CRM Dynamics一起使用时根本不起作用。CRM Dynamics有自己的处理方式

问题在于您没有提交事务,并且将TransactionScope实例与当前环境事务混淆。此外,您不必手动回滚失败的事务,这将由事务管理器在提交失败的情况下完成。以下代码应完成此工作:

SomeBusinessLogic() // do this outside of the transaction because it's not part of it

try
{
    using (TransactionScope scope = new TransactionScope())
    {
        RepoMethod1();
        RepoMethod2();

        scope.Complete(); // commits the transaction

    } // end of using calls scope.Dispose()
}
catch (TransactionAbortedException ex)
{
    // handle exception
}

谢谢你的回复。我之所以使用try-catch,是因为我想告诉最终用户出了什么问题,以便最终用户可以修复数据或其他任何东西。另外,我的问题是我的业务逻辑依赖于数据库的更新。例如,我正在修改实体的状态,并且根据新状态,我正在做其他事情。所以我不能把逻辑和事务分开。基本上,我正在执行多个数据库操作,只有在每个数据库操作都正常的情况下,我才能提交它们。如果您的业务逻辑在执行与事务相关的更改之前保存状态,则可以解决此问题。通过处理TransactionBortedException,可以通知业务逻辑恢复旧状态或重试事务或其他任何操作。您甚至不调用
Complete()
,那么您如何发现
回滚不发生?哪些内容实际保存到数据库中而不应该保存?