请参阅下面的代码。如果我初始化了多个实体上下文,那么我会在仅在第二组代码 上得到以下异常。如果我注释掉第二组它会起作用。
{"The underlying provider failed on Open."}
Inner: {"Communication with the underlying transaction manager has failed."}
Inner: {"Error HRESULT E_FAIL has been returned from a call to a COM component."}
请注意,这是一个示例应用程序,我知道连续创建 2 个上下文没有意义。但是,生产代码确实有理由在同一个 TransactionScope
中创建多个上下文,并且这一点无法更改。
编辑
这是我尝试设置 MS-DTC 的前一个问题。它似乎在服务器和客户端上都启用了。我不确定它是否设置正确。另请注意,我尝试这样做的原因之一是 TransactionScope
中的现有代码使用 ADO.NET 和 Linq 2 Sql...我希望它们也使用相同的事务。 (这听起来可能很疯狂,但如果可能的话,我需要让它发挥作用)。
How do I use TransactionScope in C#?
解决方案
Windows 防火墙阻止了与 MS-DTC 的连接。
using(TransactionScope ts = new System.Transactions.TransactionScope())
{
using (DatabaseEntityModel o = new DatabaseEntityModel())
{
var v = (from s in o.Advertiser select s).First();
v.AcceptableLength = 1;
o.SaveChanges();
}
//-> By commenting out this section, it works
using (DatabaseEntityModel o = new DatabaseEntityModel())
{
//Exception on this next line
var v = (from s1 in o.Advertiser select s1).First(); v.AcceptableLength = 1;
o.SaveChanges();
}
//->
ts.Complete();
}
最佳答案
您的 MS-DTC(分布式事务协调器)由于某种原因无法正常工作。 MS-DTC用于协调跨多个异构资源的事务结果,包括多个sql连接。
看看this link有关正在发生的事情的更多信息。
基本上,如果您确保您的 MS-DTC 正在运行并正常工作,那么使用 2 个 ADO.NET 连接应该没有问题 - 无论它们是 Entity Framework 连接还是任何其他类型。
关于c# - 为什么 TransactionScope 不能与 Entity Framework 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/794707/