2

Entity Framework 5を使用しており、1つのトランザクションで複数のストアドプロシージャ呼び出しを行う必要があります。それらはすべて挿入物であり、それぞれが前のものの出力に依存しており、1つが失敗した場合にすべてをロールバックできるようにしたいと思います。各呼び出しは同じエンティティオブジェクトを使用します。最初の呼び出しは正常に実行されますが、次の呼び出しは常に次のエラーで失敗します。

基になるプロバイダーがOpenで失敗しました。」

内部例外:「分散トランザクションマネージャー(MSDTC)のネットワークアクセスが無効になっています。コンポーネントサービス管理ツールを使用して、MSDTCのセキュリティ構成でネットワークアクセスのDTCを有効にしてください。」

内部内部例外:「トランザクションマネージャーがリモート/ネットワークトランザクションのサポートを無効にしました。(HRESULTからの例外:0x8004D024)」

DTCの道を進むことなくこれを行う方法はありますか?

コード:

ObjectParameter outputParam1 = new ObjectParameter("newEntity1", 0);
ObjectParameter outputParam2 = new ObjectParameter("newEntity2", 0);

using (var scope = new TransactionScope())
{
    try
    {
        using(var context = new DatabaseContext())
        {
            context.f_createEntity1(outputParam1);
        }

        using(var context = new DatabaseContext())
        {
            context.f_createEntity2(ouputParam2, outputParam1.Value);
        }

        ... other calls ...

        scope.Complete();
    }
    catch (Exception ex)
    {
        ... handle error ...
    }
}
4

1 に答える 1

1

DTCを有効にせずにこれを行う方法はありません。

関連するSO投稿から:

単相通知をサポートする少なくとも2つの永続的なリソースがトランザクションに参加します。たとえば、との単一の接続を参加させても、トランザクションはプロモートされません。ただし、データベースへの2番目の接続を開いてデータベースを参加させると、System.Transactionsインフラストラクチャは、それがトランザクション内の2番目の永続リソースであることを検出し、MSDTCトランザクションにエスカレーションします。

于 2012-08-28T17:36:07.933 に答える