请看以下代码。如果我初始化多个实体上下文,则只会在第二组代码上出现以下异常。如果注释掉第二组,则可以正常工作。
{"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...我希望它们也能使用相同的事务。(听起来有点疯狂,但如果可能的话,我需要让它工作)。
解决方案
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();
}