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

Vac*_*ano 2 msdtc entity-framework nservicebus

我有一个具有自托管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:合作伙伴事务管理器已禁用其对远程/网络事务的支持.但它没有说明为什么或在哪里.

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

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

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

using (TransactionScope sc=new TransactionScope(TransactionScopeOption.Suppress))
     YourDatabaseHandler.SaveMyStuff(whatever);
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*les 6

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

  • @Vaccano - ef不知道涉及nservicebus.但是,nservicebus使用的transactionscope在执行处理程序时也在范围内.ef将尝试在已经激活的事务中登记.如果dtc没有在两台机器上运行(是的,执行处理程序和数据库服务器的机器)启用了网络访问,则这将失败.这几乎是你想要的,因为你想要消息队列事务和数据库事务之间的原子性. (2认同)