在具有多个上下文的Entity Framework上使用异步保存更改

Aar*_*ers 6 c# asp.net-mvc entity-framework unit-of-work async-await

我正在使用带有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)
        {
            //..
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我运行此代码保存两个上下文中的更改时,我得到:

事务管理器已禁用其对远程/网络事务的支持.(HRESULT异常:0x8004D024)

等待_context2.SaveChangesAsync(); 是错误发生的地方.如果我从此函数中删除TransactionScope,代码似乎没有错误.我对于删除多个上下文的范围犹豫不决.

以防万一它会有所帮助,这是我用来调用这个函数的代码:

        state.Name = "Texas";
        _uow.StateRepository.Update(state);

        user.FirstName = "John";
        _uow.UserRepository.Update(user);

        await _uow.CommitAsync();
Run Code Online (Sandbox Code Playgroud)

谢谢!

usr*_*usr 3

在同一范围内使用两个连接需要 MSDTC。

您可以启用MSDTC来解决此问题。但它不适用于许多 HA 解决方案并且速度很慢。

避免使用 MSDTC 的唯一方法是对必须处理的所有事务使用相同的连接。由于您正在使用多个数据库,这比平常更难。您需要使用SqlConnection.ChangeDatabase或发出相应的 SQL 在同一连接上的数据库之间进行切换。连接必须保持打开状态。

或者,您可以为对象引用使用三个部分名称(例如DB1.dbo.MyTable)。

没有其他办法。MSDTC 或共享同一连接。