为什么我的TransactionScope在EF Code First应用程序中使用时会尝试使用MSDTC?

时间:2012-07-12 11:45:00

标签: .net entity-framework transactionscope

我刚刚使用EF 4.3 Code First针对SQL 2010 Express本地数据库向一个MVC3应用程序引入了TransactionScope用法。当我在范围内尝试SaveChanges时,我得到一个“提供程序未能打开”的通知,内部异常有关缺少的MSDTC。据我所知,只有在我使用多个连接字符串时才会出现这种情况。我只使用连接到一个DB,我在应用程序中只有1个字符串。但是,我确实使用了几个DbContext实例,但只在事务范围内使用了一个。

我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:4)

不确定它是否与此帖相似? How to run two Entity Framework Contexts inside TransactionScope without MSDTC?

解决方法是:

0)创建可推广事务(取决于SQL Server版本?)(http://msdn.microsoft.com/en-us/library/ms172070.aspx

1)实体框架 - MSDTC Gotchya(http://joeknowsdotnet.wordpress.com/2012/07/19/entity-framework-msdtc-gotchya/

2)避免不必要的升级到分布式事务(http://petermeinl.wordpress.com/2011/03/13/avoiding-unwanted-escalation-to-distributed-transactions/

答案 1 :(得分:0)

我认为如果你有一个事务范围并打开两个单独的连接,即使它们是相同的连接字符串的Same数据库,你会发现该事务将被提升为分布式事务。

http://www.bomisofmab.com/blog/?p=184充分描述了这种情况。

答案 2 :(得分:0)

当您的应用程序第一次调用EF时,它将进行初始化(如果它不存在,它将构建数据库等)如果第一次调用是在TransactionScope中,它将提升为DTC。

要解决此问题,请在您的app启动方法中调用EF,这将确保EF将在TransactionScope之外进行初始化。从此处开始,您可以在TransactionScope中包含一个或多个EF调用,并且不会向DTC提供以下内容: a)你总是使用完全相同的连接字符串,和 b)您正在使用Sql Server 2008及更高版本(您是)。

相关问题