同じサーバー上のデータベース X 用とデータベース Y 用の 2 つの Entity Framework ObjectContexts が初期化されている TransactionScope の使用に問題があります。
最初のコンテキスト「cersCtx」は、新しい「Contact」オブジェクトを作成します。2 番目のコンテキスト「coreCtx」は、アカウントを見つけようとします。
アカウントを見つけるための 2 番目のコンテキストでの呼び出し
account = coreCtx.Accounts.SingleOrDefault(p => p.Email == email && !p.Voided);
次のエラーが表示されます。
通信の問題により、MSDTC トランザクション マネージャーはソース トランザクション マネージャーからトランザクションを取得できませんでした。考えられる原因は次のとおりです。ファイアウォールが存在し、MSDTC プロセスの例外がない、2 台のマシンが NetBIOS 名で互いを検出できない、またはネットワーク トランザクションのサポートが 2 つのトランザクション マネージャーのいずれかで有効になっていない。(HRESULT からの例外: 0x8004D02B)
奇妙なことに、MSDTC にアクセスすると、コミットされたトランザクションが表示されますが、ほとんどの場合、それらは中止されています。
この問題を解決する方法について何かアイデアはありますか?
この問題を引き起こすコードの簡略化されたサンプルを次に示します。
public void CreateContact(string email)
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
using (CERSEntities cersCtx = new CERSEntities())
{
Contact contact = new Contact();
contact.Email = email;
cersCtx.Contacts.AddObject(contact);
cersCtx.SaveChanges();
}
CoreModel.Account account = null;
using (CoreModel.CoreEntities coreCtx = new CoreModel.CoreEntities())
{
account = coreCtx.Accounts.SingleOrDefault(p => p.Email == email && !p.Voided);
}
scope.Complete();
}
}