尽管我使用相同的连接字符串,但TransactionScope仍提升为MSDTC

vto*_*ola 3 msdtc transactions transactionscope sql-server-2008-r2 entity-framework-4.3

我有两个存储库指向相同的SQL Server 2008 R2(10.50.2550.0)数据库。一个存储库基于Entity Framework,另一个使用常规的SqlConnection。我需要执行涉及这两者的操作,因此我使用了a TransactionScope来使它们保持在同一事务中:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = IsolationLevel.RepeatableRead }))
{
   _repoA.DoStuff();
   _repoB.DoStuff();
}
Run Code Online (Sandbox Code Playgroud)

由于我在两者中都使用相同的连接字符串:

"Data Source=(local);Initial Catalog=mydb;User Id=myid;Password=mypass;Asynchronous Processing=true"
Run Code Online (Sandbox Code Playgroud)

我期望SQL Server 2008 R2可以使用多个连接而无需扩展。不幸的是,我得到一个例外的说法:

发生System.Data.SqlClient.SqlException Message = MSDTC在服务器'MyComputer'上不可用。Source = .Net SqlClient数据提供程序
ErrorCode = -2146232060类= 16 LineNumber = 1 Number = 8501
Procedure =“” Server =(local)State = 2 StackTrace:位于System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔值BreakConnection )

可能是什么问题呢?

干杯。

vto*_*ola 5

好吧,我找到了原因。实体框架将我的连接字符串修改为:

"Data Source=(local);Initial Catalog=mydb;User Id=myid;Password=mypass;Asynchronous Processing=true;Application Name=EntityFrameworkMUE"
Run Code Online (Sandbox Code Playgroud)

这就是将其提升为MSDTC的原因!

为了避免这种情况,我在连接字符串中设置了自己的“应用程序名称”,现在可以正常使用。

干杯。