从NServiceBus方法调用实体框架会导致错误

时间:2011-11-10 23:56:03

标签: entity-framework nservicebus msdtc

我有一个拥有自托管WCF服务的解决方案。该服务连接到EF,可以正常读写。

在同一解决方案中,我还托管了一个NServiceBus端点。它从单独的运行解决方案中获取事件。

当我运行NServiceBus项目(单独)时,似乎工作正常,直到我尝试查询我的数据库。当我这样做时,我得到这个EntityException:

  

底层提供程序在Open上失败。

内部异常是TransactionException,消息为:

  

合作伙伴事务管理器已禁用其对远程/网络事务的支持

我的NServiceBus和WCF服务项目都使用完全相同的配置和EF项目。我不明白为什么一个失败而另一个失败。

我做了一些谷歌搜索并遇到了这个页面:http://msdn.microsoft.com/en-us/library/aa561924%28BTS.20%29.aspx向我展示了如何设置MSDTC,我在我的客户端计算机上完成了它。但它没有效果。

我还发现这个问题需要设置:NServiceBus: System.Transactions.TransactionException: The partner transaction manager has disabled its support for remote/network transactions。但它没有说明为什么或在哪里。

我是否需要在数据库服务器上设置MSDTC?如果是这样,为什么?什么是MSDTC?

为什么从NServiceBus托管进程运行会导致此错误?

更新:我发现这个link帮助我理解了DTC的作用。它还告诉我如何在需要时将其关闭:

using (TransactionScope sc=new TransactionScope(TransactionScopeOption.Suppress))
     YourDatabaseHandler.SaveMyStuff(whatever);

虽然在许多情况下听起来好像是件好事。

1 个答案:

答案 0 :(得分:6)

由于NSB正在使用事务性队列,因此您将参与分布式事务。这意味着参与的每台机器都必须投票决定是否完成交易。这是通过分布式事务处理协调器(MSDTC)完成的。这必须在两台机器上运行(如果您使用其他数据库,如Oracle,则还有其他服务)。要管理MSDTC,请转到组件服务 - >计算机 - >我的电脑 - >分布式事务协调器 - >本地DTC。右键单击该节点,您将找到包括安全性在内的所有配置。