请参阅下面的代码。如果我初始化多个实体上下文,那么我在第二组代码上得到以下例外。如果我注释掉第二组,它就可以工作。为什么TransactionScope不能与实体框架一起使用?
{ “底层提供对打开失败。”}
内:{ “与基础事务管理器通信失败。”}
内:{“错误HRESULT E_FAIL已退还从一个COM组件调用。“}
请注意,这是一个示例应用程序,我知道它没有意义在一行中创建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();
}
我不只是使用实体框架,因此重复使用EntityConnection也不是一个简单的解决方案(请参阅上面的编辑) – NotDan 2009-04-27 19:01:07
+1用于避免DTC。这并不是坏事,只是分布式交易不是轻易选择的东西。这是应用程序和资源的紧密链接,可能会降低设计的可用性。 – 2009-04-27 19:48:43
您也可以调用context.Connection.Open()手动管理它。你不需要手动创建EntityConnection – 2009-12-24 16:41:23