以下のコードを見てください。複数のエンティティコンテキストを初期化すると、 2番目のコードセットでのみ次の例外が発生します 。 2番目のセットをコメントアウトするとうまくいきます。
{「基礎となるプロバイダはOpenに失敗しました。」}
内部:{"基になるトランザクションマネージャとの通信に失敗しました。"}
内部:{"エラーHRESULT E_FAILがCOMコンポーネントへの呼び出しから返されました。"}
これはサンプルアプリであり、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();
}
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();
}