TransactionScopeがEntity Frameworkと連携しないのはなぜですか?

.net c# entity-framework transactions transactionscope

質問

以下のコードを見てください。複数のエンティティコンテキストを初期化すると、 2番目のコードセットでのみ次の例外が発生します 。 2番目のセットをコメントアウトするとうまくいきます。

{「基礎となるプロバイダは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();
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ