[英]EF6 Nested Transactions
我有一个命令服务 class,它利用工作单元模式,使用各种方法通过实体框架更新数据库(在本例中为 SQL Azure)。
命令服务通过对 dbcontext 实例的引用进行实例化,其生命周期由我选择的 DI 框架管理。
一些命令服务类的方法将对数据库的多个更新包装在一个事务中,例如:
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();
}
}
现在,其中一些方法从其事务中调用命令 class 的其他方法,例如:
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 代码
EntityFramework的DBContexts本身实现了UnitOfWork和Repository模式。
EF6中的上下文也自动包装事务中的所有提交(如果它还不是一部分)。
所以,不,你不应该在多个工作单元之间共享一个上下文。 他们应该各自得到自己的。
UPDATE
如果您尝试在同一个DbContext上启动重复事务,则会得到:
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.
所以不,你不能做你想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.