在具有多个上下文的 Entity Framework 上使用异步保存更改
Using asynchronous save changes on Entity Framework with multiple contexts
我正在使用具有 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)
{
//..
}
}
当我 运行 此代码在两种上下文中保存更改时,我得到:
The transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D024)
await _context2.SaveChangesAsync();是错误发生的地方。如果我从此函数中删除 TransactionScope,代码似乎可以正常工作。我对删除多个上下文的范围犹豫不决。
为了以防万一,下面是我用来调用此函数的代码:
state.Name = "Texas";
_uow.StateRepository.Update(state);
user.FirstName = "John";
_uow.UserRepository.Update(user);
await _uow.CommitAsync();
谢谢!
在同一范围内使用两个连接需要 MSDTC。
您可以启用MSDTC 来解决这个问题。但它不适用于许多 HA 解决方案并且速度很慢。
避免使用 MSDTC 的唯一方法是对必须处理的所有内容使用相同的连接。由于您使用的是比平时更难的多个数据库。您需要使用 SqlConnection.ChangeDatabase
或发出相应的 SQL 以在同一连接上的数据库之间切换。连接必须保持打开状态。
或者,您可以使用三部分名称作为对象引用(例如 DB1.dbo.MyTable
)。
没有别的办法。 MSDTC 或共享同一连接。
我正在使用具有 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)
{
//..
}
}
当我 运行 此代码在两种上下文中保存更改时,我得到:
The transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D024)
await _context2.SaveChangesAsync();是错误发生的地方。如果我从此函数中删除 TransactionScope,代码似乎可以正常工作。我对删除多个上下文的范围犹豫不决。
为了以防万一,下面是我用来调用此函数的代码:
state.Name = "Texas";
_uow.StateRepository.Update(state);
user.FirstName = "John";
_uow.UserRepository.Update(user);
await _uow.CommitAsync();
谢谢!
在同一范围内使用两个连接需要 MSDTC。
您可以启用MSDTC 来解决这个问题。但它不适用于许多 HA 解决方案并且速度很慢。
避免使用 MSDTC 的唯一方法是对必须处理的所有内容使用相同的连接。由于您使用的是比平时更难的多个数据库。您需要使用 SqlConnection.ChangeDatabase
或发出相应的 SQL 以在同一连接上的数据库之间切换。连接必须保持打开状态。
或者,您可以使用三部分名称作为对象引用(例如 DB1.dbo.MyTable
)。
没有别的办法。 MSDTC 或共享同一连接。