为什么TransactionScope不能与Entity Framework一起使用?

.net c# entity-framework transactions transactionscope

请参阅下面的代码。如果我初始化多个实体上下文,那么我第二组代码上得到以下异常。如果我注释掉第二组就行了。

{“底层提供商在Open上失败。”}

内部:{“与基础事务管理器的通信失败。”}

内部:{“错误HRESULT E_FAIL已从调用COM组件返回。”}

请注意,这是一个示例应用程序,我知道连续创建2个上下文没有意义。但是,生产代码确实有理由在同一个TransactionScope创建多个上下文,并且无法更改。

编辑

这是我之前尝试设置MS-DTC的问题。它似乎在服务器和客户端上都启用了。我不确定它是否设置正确。另请注意,我尝试这样做的原因之一是TransactionScope中的现有代码使用ADO.NET和Linq 2 Sql ...我希望那些也使用相同的事务。 (这可能听起来很疯狂,但如果可能,我需要让它工作)。

如何在C#中使用TransactionScope?

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连接。

请查看此链接 ,了解有关正在发生的事情的更多信息。

基本上,如果您确保MS-DTC正在运行并且正常工作,那么使用2个ADO.NET连接应该没有问题 - 无论它们是实体框架连接还是任何其他类型。


热门答案

您可以通过管理自己的EntityConnection并将此EntityConnection传递给ObjectContext来避免使用分布式事务。否则看看这些。

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=580828&SiteID=1&mode=1 http://forums.microsoft.com/msdn/showpost.aspx?postid=113669&siteid=1&sb=0&d=1&at=7&ft = 11&TF = 0&的pageid = 1

EntityConnection conn = new EntityConnection(ConnectionString);

using (TransactionScope ts = new TransactionScope())
{
    using (DatabaseEntityModel o = new DatabaseEntityModel(conn))
    {
            var v = (from s in o.Advertiser select s).First();
            v.AcceptableLength = 1;
    }

    //-> By commenting out this section, it works
    using (DatabaseEntityModel o = new DatabaseEntityModel(conn))
    {
        //Exception on this next line
        var v = (from s1 in o.Advertiser select s1).First();
                v.AcceptableLength = 1;
    }
    //->

    ts.Complete();
}


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因