【发布时间】:2015-11-07 20:25:13
【问题描述】:
我正在使用带有 UoW 模式的 EF 6。由于我使用来自多个数据库的数据,因此我在 UoW 中定义了多个上下文。除了我定义的 CommitAsync 函数外,一切似乎都正常工作。这是我的代码:
public async Task CommitAsync()
{
try
{
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
if (_context1 != null)
await _context1.SaveChangesAsync();
if (_context2 != null)
await _context2.SaveChangesAsync();
scope.Complete();
}
}
catch (DbEntityValidationException ex)
{
//..
}
}
当我在两个上下文中运行此代码保存更改时,我得到:
事务管理器已禁用对远程/网络事务的支持。 (HRESULT 异常:0x8004D024)
等待_context2.SaveChangesAsync();是错误发生的地方。如果我从此函数中删除 TransactionScope,则代码似乎可以正常工作。我对删除多个上下文的范围犹豫不决。
以防万一,这是我用来调用此函数的代码:
state.Name = "Texas";
_uow.StateRepository.Update(state);
user.FirstName = "John";
_uow.UserRepository.Update(user);
await _uow.CommitAsync();
谢谢!
【问题讨论】:
-
代码没有问题,它是运行代码的盒子上的配置 msdtc 已禁用远程/网络事务。
-
为什么要使用TransactionScope?如果保存失败,无论如何都会撤消。使用 TransactionScope 只会导致可能的死锁。
-
@JamieRees 我怀疑 OP 希望两个更新都能正常工作或两者都失败,并避免一个工作但一个失败的情况。
-
是的,这很有道理!
-
你知道这需要分布式事务吗?主要问题是它们不适用于许多 HA 解决方案。问题 2 是性能。
标签: c# asp.net-mvc entity-framework async-await unit-of-work