首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用事务作用域的实体框架回滚

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

Stack Overflow用户
提问于 2018-08-14 07:57:07
回答 1查看 903关注 0票数 0

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

代码语言:javascript
复制
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。当使用常规EF时,这是可行的,但与CRM Dynamics一起使用时,它就不能工作了。CRM Dynamic有自己的处理方法。

EN

回答 1

Stack Overflow用户

发布于 2018-08-14 08:47:44

问题是,您没有提交事务,并且将TransactionScope实例与当前环境事务混合在一起。此外,您不必手工回滚失败的事务,这将由事务管理器完成,以防提交失败。下面的代码应该完成这项工作:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51836451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档