0

EnterpriseLibrary と Unity を使用する 1 つのアプリがあり、TransactionScope を 1 か所で使用します。これは、SQL Server 2005 に対して実行されるという事実にもかかわらず、うまく機能します。

// Execute a stored proc using a DbDatabase object inserted by Unity

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    // Update something using the same DbDatabase object
    // Run the stored proc above, again
    // Assert that the results are different than from the previous call.
}

はい、これは故意に なしで終了しますscope.Complete(): 例はテストからのものです。

また、開始したばかりの別のアプリケーションもあります。Entity Framework 4.1 を使用しています。同じサーバー上の同じデータベースにアクセスします。TransactionScope同じ「変更を加え、変更を検証し、変更をロールバックする」という考えを念頭に置いて、を使用しようとしました。

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    using(ProjectEntities db = new ProjectEntities())
    {
         Assert.IsFalse(db.tblEntities.Any(e=>e.X == desired_value));

         db.tblEntities.Add(new tblEntity() { X = desired_value });
         db.SaveChanges();

         Assert.IsTrue(db.tblEntities.Any(e=> e.X == desired_value));

    }
}

これは、MSDTC がネットワーク アクセスに対して有効になっていないというよく知られたエラーで失敗します。

今、この瞬間、最初のプロジェクトの最初のテストは成功し、2 番目のテストは失敗しました。

だから私は2つの質問があります:

  1. トランザクションが MSDTC にエスカレートしないように、2 番目のテストを再調整する方法はありますか?

  2. 2つのフレームワークから異なる結果が得られる理由を知っている人はいますか? EntLib は、使用中ずっと単一の接続を割り当てて開いたままにしますか? EF は反対のことをしますか?

4

2 に答える 2

1

EnterpriseLibraryについてはわかりませんが、EFはクエリごとに新しい接続を作成して開きます。これが、これらの異なる結果が表示される理由だと思います。

これは、2つのDbConnectionsを手動で開くことで確認できます。

于 2012-12-07T23:02:51.300 に答える
1

EF、EntLib DAAB、および TransactionScope に関して多くのテストを行いました。

考慮しなければならない点がいくつかあります。

  • SQL Server のバージョン
  • 接続文字列
  • EF と EntLib のバージョン

他の組み合わせは覚えていませんが、SQL Server 2008 以降、EF5、および Entlib 5 を使用すると、TransactionScopeMSDTC にスケーリングすることなく、複数の DbContext と DAAB 操作を同じように登録できます。しかし、非常にトリッキーな部分があります:

  • 接続文字列には次を含める必要があります。MultipleActiveResultSets=true;
  • 接続文字列は、EF で使用される正確な形式である必要があります

2 番目の部分は最も紛らわしいものです。EF への接続文字列を使用すると、その形式が変更されますが、EntLib は構成ファイルの接続文字列でそのまま使用します。そのため、コードをデバッグし、EF によって使用される接続文字列の変更されたバージョンを書き留めておく必要があります。で見つけることができますctx.Database.Connection.ConnectionString。ここで、ctx は使用している DbContext です。これを行ったら、変更したバージョンの接続文字列をコピーして構成ファイルに貼り付けるだけで、EF と EntLib の両方が同じ接続文字列を使用するため、MSDTC にエスカレートしません。

SQL Server の以前のバージョン (場合によっては EF のバージョンによって異なります) では、さまざまな問題を見つけることができますが、このガイドラインは正確なセットアップをテストするのに役立ちます。

于 2013-04-29T08:42:14.660 に答える