我有一个命令服务类,它使用工作单元模式,使用各种方法通过实体框架更新数据库(在本例中是SQL)。
命令服务通过对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();
}
}现在,其中一些方法从它们的事务中调用命令类的其他方法,例如:
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代码
发布于 2016-05-13 14:52:46
EntityFramework的DBContexts本身实现了UnitOfWork和Repository模式。
EF6中的上下文还自动包装事务本身中的所有提交(如果它还不是事务的一部分)。
因此,不,您不应该在多个工作单元之间共享上下文。他们每个人都应该有自己的。
更新
如果您试图在相同的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.所以不,你不能按你的要求去做。
https://stackoverflow.com/questions/37212896
复制相似问题