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

标签 c# asp.net-mvc entity-framework async-await unit-of-work

我正在使用具有 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 或共享同一连接。

关于c# - 在具有多个上下文的 Entity Framework 上使用异步保存更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012452/

相关文章:

c# - IComparer 可以用于在填充列表时对列表进行哈希吗?

c# - 如何更新异步获取的 View 模型属性?

asp.net - 如何将 ASP.net Identity 与第 3 方 REST 服务结合使用进行身份验证?

c# - 使用 Entity Framework 代码优先创建表、运行时

.net - 在 IQueryable 的 Select 中调用 DTO 转换器

c# - 在项目设置中保存 DateTimeOffset 设置时丢失精度

c# - 在 asp.net 网站中打印网页时,分页之前无法在 firefox 浏览器中工作

asp.net-mvc - 吉米博加德 : "Ajax is used very, very sparingly." Why?

c# - 在 MVC 中使用 EF 创建多个数据库并将数据库名称作为 web.config 中的变量传递给 InitialCatalogue

c# - 如果修改了详细实体,为什么 EntityFramework 会更新主从关系中的主实体?