实体框架和分布式事务协调器

时间:2015-10-07 14:11:33

标签: c# entity-framework transactions transactionscope msdtc

我想知道我的交易范围为什么会给我以下错误:

  

"初始化数据库时发生异常。见   InnerException以获取详细信息。"

     

- > "基础提供商在Open上失败。"

--> "Communication with the underlying transaction manager has failed."

 --> "The MSDTC transaction manager was unable to pull the transaction
       from the source transaction manager due to communication problems.
       Possible causes are: a firewall is present and it doesn't have an
       exception for the MSDTC process, the two machines cannot find each
       other by their NetBIOS names, or the support for network transactions
       is not enabled for one of the two transaction managers. (Exception
       from HRESULT: 0x8004D02B)"

作为Stackoverflow的优秀用户,我搜索并应用了许多解决方案但仍然存在此错误。以下是我检查过的一些问题和答案:

MVC 3 : The MSDTC transaction manager was unable to pull the transaction from the source

The MSDTC transaction manager was unable to pull the transaction from the source transaction manager due to communication problems

The transaction manager has disabled its support for remote/network transactions

因此,让我向您介绍一下系统的背景信息。基本上,它使用了一个使用通用存储库的反向工程实体框架。但是,使用了两个MS SQL数据库,它们位于同一服务器上。结果是有两个db上下文。最重要的是,放置一个工作模式单元,用于将它们包装在事务范围中的服务层。所以代码看起来像这样:

using(var transactionManager = TrasactionManager)
{
    using (var unitOfWork = FirstUnitOfWork)
    {
        //Setup linq queries and get data to modify and or delete entities...

        unitOfWork.Commit(); //DBContext.SaveChanges();
    }

    using (var unitOfWork = SecondUnitOfWork)
    {
        //Setup linq queries. Fails here...

        unitOfWork.Commit(); //DBContext.SaveChanges();
    }

    transactionManager.Complete();
}

现在,当调用第二个使用块的工作单元中的第一个查询时,抛出错误。

如您所见,当调用unitOfWork.Commit()方法时,它会调用db上下文中的SaveChanges()方法。然后,using块处理unitOfWork,而unitOfWork又调用db context Dispose()方法。虽然两个工作单元都在为两个数据库设置单独的数据库上下文,但使用单独的连接字符串,这些字符串在using语句完成时关闭。所以我想知道这不是问题,因为db上下文可能需要共享一个连接字符串。如果是这样,我该怎么做呢?

也许有人对如何修复此错误有另一个想法?我考虑将两个using语句分成单独的方法调用,但如果需要回滚则会出现问题。

我希望我的问题和细节明确吗?

提前致谢

0 个答案:

没有答案