4

さまざまなビジネス モジュール用に作成されたテーブルを含むかなり大きなデータベースがあります。

モジュールごとに異なる edmx ファイルを作成することにしました。

ただし、異なる edmx で複数のテーブルへの書き込みが発生する論理アクションの TransactionScope を実装しようとするときに、MSDTC の使用を防ぐにはどうすればよいですか? 繰り返しますが、基になるデータベースは同じです。このシナリオでは MSDTC を使用したくありません。

アクティブなトランザクションで開かれた SQL 接続を渡す方法はありますか?

事前に助けてくれてありがとう。

よろしく、ウィリアム

4

2 に答える 2

2

TransactionScopeデータベースが異なる場合や接続文字列が異なる場合に、MSDTC を登録します。

Rick Strahl はこれについて素晴らしい記事を書いています (彼の視点は LINQ to SQL ですが、EF にも当てはまります)。お金の段落:

TransactionScope は高レベルのトランザクション ラッパーであり、トランザクションを手動で追跡することなく、任意のコードをトランザクションに簡単にラップできます。従来、TransactionScope は分散トランザクション コーディネーター (DTC) の .NET ラッパーでしたが、その機能は多少拡張されています。懸念事項の 1 つは、DTC はリソース使用量の点でかなり高価であり、DTC サービスが実際にマシン上で実行されている必要があることです (さらに別のサービスは、クライアント インストールで特に厄介です)。

ただし、TransactionScope と SQL Server クライアント ドライバーに対する最近の更新により、単一のデータベースに対して単一の一貫した接続文字列を使用して実行している限り、DTC を必要とせずに TransactionScope クラスとその使いやすさを使用できるようになりました。上記の例では、トランザクションは DataContext の 1 つのインスタンスで動作するため、トランザクションは実際には DTC を使用せずに動作します。これは SQL Server 2008 にあります。

Rickのブログへのリンクを見つけたこのSOの質問/回答も参照してください。

そのため、同じデータベースに接続し、同じ接続文字列を使用している場合、DTC は関係ありません。

于 2012-10-17T03:04:54.110 に答える
0

上記のすべての返信に感謝します!

ちなみに、EntityConnectionとEntityTransactionを明示的に使用する解決策を見つけることができました。サンプルは次のようになります。

    string theSqlConnStr = "data source=TheSource;initial catalog=TheCatalog;persist security info=True;user id=TheUserId;password=ThePassword";

    EntityConnectionStringBuilder theEntyConnectionBuilder = new EntityConnectionStringBuilder();
    theEntyConnectionBuilder.Provider = "System.Data.SqlClient";
    theEntyConnectionBuilder.ProviderConnectionString = theConnectionString;
    theEntyConnectionBuilder.Metadata = @"res://*/";

    using (EntityConnection theConnection = new EntityConnection(theEntyConnectionBuilder.ToString()))
    {
        theConnection.Open();
        theET = null;

        try
        {
            theET = theConnection.BeginTransaction();

            DataEntities1 DE1 = new DataEntities1(theConnection);
            //DE1 do somethings...

            DataEntities2 DE2 = new DataEntities2(theConnection);
            //DE2 do somethings...

            DataEntities3 DE3 = new DataEntities3(theConnection);
            //DE3 do somethings...

            theET.Commit();
        }
        catch (Exception ex)
        {
            if (theET != null) { theET.Rollback(); }
        }
        finally
        {
            theConnection.Close();
        }
    }

EntityConnection と EntityTransaction を明示的に使用することで、MSDTC を使用する必要なく、単一のデータベースの複数の ObjectContext に対して単一の接続とトランザクションを共有できます。

この情報がお役に立てば幸いです。幸運を!

于 2012-10-19T06:00:33.343 に答える