Entity Framework和Distributed Transaction Coordinator

19 浏览
0 Comments

Entity Framework和Distributed Transaction Coordinator

我已经尽力去弄清楚为什么我的事务范围会给我以下错误,但是我还是束手无策:\n“在初始化数据库时发生异常。有关详细信息,请参见InnerException。”\n-->“底层提供程序在打开时发生故障。”\n-->“与底层事务管理器的通信失败。”\n-->“由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务。可能的原因是:存在防火墙,并且没有为MSDTC进程设置例外,两台机器无法通过NetBIOS名称找到彼此,或者两个事务管理器中的一个未启用网络事务的支持。(HRESULT异常:0x8004D02B)”\n作为Stackoverflow的一名好用户,我已经查找并尝试了许多解决方案,但这个错误仍然持续存在。以下是我查看过的一些问题和答案:\nMVC 3:MSDTC事务管理器无法从源中提取事务\n由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务\n事务管理器已禁用对远程/网络事务的支持\n让我给你一些正在使用的系统的背景信息。基本上,它使用了一个反向工程的Entity Framework,使用了一个通用的存储库。然而,使用了两个位于同一台服务器上的MS SQL数据库。其结果是有两个数据库上下文。在此之上,有一个工作单元模式,它在一个包装它们的事务范围中使用。所以代码看起来是这样的:\n

using(var transactionManager = TrasactionManager)
{
    using (var unitOfWork = FirstUnitOfWork)
    {
        //设置Linq查询并获取要修改和/或删除实体的数据...
        unitOfWork.Commit(); //DBContext.SaveChanges();
    }
    using (var unitOfWork = SecondUnitOfWork)
    {
        //设置Linq查询。在这里失败...
        unitOfWork.Commit(); //DBContext.SaveChanges();
    }
    transactionManager.Complete();
}

\n现在,当第二个工作单元的第一个查询块中调用时,会抛出错误。\n如您所见,当调用unitOfWork.Commit()方法时,它会调用db上下文中的SaveChanges()方法。然后,using块会处理掉unitOfWork,这反过来调用db上下文的Dispose()方法。尽管两个工作单元为两个数据库设置了单独的db上下文,使用不同的连接字符串,在using语句完成时关闭。所以我想知道这是否是问题,也许db上下文需要共享一个连接字符串。如果是这样,我应该如何做?\n也许有人对如何修复这个错误有其他想法?我正在考虑将这两个using语句分离成单独的方法调用,但如果需要回滚,这可能会有问题。\n希望我的问题和详细信息清楚明了。\n提前感谢您的帮助。

0