[英]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)
{
//..
}
}
當我運行此代碼時,在兩個上下文中保存更改都會得到:
事務管理器已禁用對遠程/網絡事務的支持。 (來自HRESULT的異常:0x8004D024)
等待_context2.SaveChangesAsync(); 是錯誤發生的地方。 如果我從此函數中刪除TransactionScope,代碼似乎可以正常工作。 我不願刪除多個上下文的范圍。
以防萬一,這是我用來調用此函數的代碼:
state.Name = "Texas";
_uow.StateRepository.Update(state);
user.FirstName = "John";
_uow.UserRepository.Update(user);
await _uow.CommitAsync();
謝謝!
在同一作用域中使用兩個連接需要MSDTC。
您可以啟用MSDTC來解決此問題。 但是它不適用於許多高可用性解決方案,並且運行緩慢。
避免使用MSDTC的唯一方法是對必須處理的所有事物使用相同的連接。 由於您正在使用多個數據庫,因此比平常更難。 您需要使用SqlConnection.ChangeDatabase
或發出相應的SQL在同一連接上的數據庫之間切換。 連接必須保持打開狀態。
另外,您可以使用三個部分名稱作為對象引用(例如DB1.dbo.MyTable
)。
沒有別的辦法了。 MSDTC或共享同一連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.