為什麼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合法嗎? 是的,了解原因