簡體   English   中英

在具有多個上下文的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)
        {
            //..
        }
    }

當我運行此代碼時,在兩個上下文中保存更改都會得到:

事務管理器已禁用對遠程/網絡事務的支持。 (來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM