1

同じサーバー上のデータベース 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();
    }
}
4

0 に答える 0