首页 > 解决方案 > 使用事务范围的实体框架回滚

问题描述

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

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 有自己的处理方式。

标签: .netentity-frameworkdynamics-crmdynamics-crm-2011transactionscope

解决方案


问题是您没有提交事务,并且您将 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
}

推荐阅读