请参阅下面的代码。如果我初始化了多个实体上下文,那么我只会在第二组代码中得到以下异常。如果我注释掉第二组它会起作用。
{“底层提供程序在打开时失败。”}
内部:{“与底层事务管理器的通信失败。”}
内部:{“错误 HRESULT E_FAIL 已从对 COM 组件的调用中返回。”}
请注意,这是一个示例应用程序,我知道连续创建 2 个上下文没有意义。但是,生产代码确实有理由在同一个 中创建多个上下文TransactionScope
,这是无法更改的。
编辑
这是我之前尝试设置 MS-DTC 的问题。它似乎在服务器和客户端上都启用了。我不确定它是否设置正确。另请注意,我尝试这样做的原因之一是TransactionScope
使用 ADO.NET 和 Linq 2 Sql 中的现有代码......我希望那些也使用相同的事务。(这可能听起来很疯狂,但如果可能的话,我需要让它工作)。
解决方案
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();
}