首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF6嵌套事务

EF6嵌套事务
EN

Stack Overflow用户
提问于 2016-05-13 14:39:02
回答 1查看 4.9K关注 0票数 9

我有一个命令服务类,它使用工作单元模式,使用各种方法通过实体框架更新数据库(在本例中是SQL)。

命令服务通过对dbcontext实例的引用进行实例化,该实例的生存期由我选择的DI框架管理。

一些命令服务类的方法封装了事务中数据库的多个更新,例如:

代码语言:javascript
复制
public void UpdateStuff(someEntity)
{
    using(var tx = _db.Database.BeginTransaction())
    {
        //Some updates to db
        _db.SaveChanges();
        //Some other updates to db
        _db.SaveChanges();
        tx.Commit();
    }
}

现在,其中一些方法从它们的事务中调用命令类的其他方法,例如:

代码语言:javascript
复制
public void UpdateWithSomeCascadingStuff(someOtherEntity)
{
    using(var tx = _db.Database.BeginTransaction())
    {
        //Some updates to db
        _db.SaveChanges();

        //Some other cascading logic and updates to db
        var relatedEntityToUpdate = _query.GetSomeEntityToUpdate(someOtherEntity);
        UpdateStuff(relatedEntityToUpdate);
        _db.SaveChanges();
        tx.Commit();
    }
}

显然,通过这样做,我为同一个DbContext实例嵌套EF事务。

这是否得到支持,是否会造成任何麻烦?我能采取什么替代的方法吗?

更新:我首先使用EF6代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-13 14:52:46

EntityFramework的DBContexts本身实现了UnitOfWork和Repository模式。

EF6中的上下文还自动包装事务本身中的所有提交(如果它还不是事务的一部分)。

因此,不,您不应该在多个工作单元之间共享上下文。他们每个人都应该有自己的。

更新

如果您试图在相同的DbContext上启动重复的事务,您将得到:

代码语言:javascript
复制
An unhandled exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll

Additional information: The connection is already in a transaction and cannot participate in another transaction. EntityClient does not support parallel transactions.

所以不,你不能按你的要求去做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37212896

复制
相关文章

相似问题

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