0

私は MySQL (MARS をサポートしていません) を使用しており、複数の を並行して実行しようとしていますSELECT。接続文字列は同じですが、それぞれSELECTに別の db コンテキストを作成します。

次のようになります。

using (var db = DataContextCreator.Instance.Create())
{
  return db.Customers
           .Where(it => it.customer_Id > 10)
           .Detach(db.Customers);
}

一言Detach-- これは、1 つまたは複数のレコードを取得するヘルパー メソッドです。2番目のケースでは、それらのリストを作成し(それらを具体的なデータにするため)、データベースコンテキストからレコードを切り離し(GCがデータベースコンテキストを解放できるように)、切り離されたデータを返します。

今のところ、「この接続に関連付けられた開いている DataReader が既にあり、最初に閉じる必要があります」という恐ろしいエラーが表示されます。私は明示的に DataReader を使用していないので、その理由を 100% 確信したいと思います。

単一の接続文字列を使用してこれらすべての db コンテキストを作成しているためですか? 言い換えれば、上記のシナリオには MARS が必要ですか?

ホイールを再発明したくないので質問しています。また、すべてのクエリがかなり小さくて速いので、愚かな回避策を考えています-dbコンテキストクリエーターでロックを使用します。このようにして、データベースをクエリする各ブロックは、別のブロックと並行して実行されないことが保証されます。

4

2 に答える 2

3

SqlConnectionMARS は、1 つのオブジェクトに対して複数のクエリを同時に実行している場合にのみ影響します。

一般に、すべてDbContextのオブジェクトには独自のDbConnectionオブジェクトがあるため、おそらくここでは問題になりません。

ここでの問題は、Detachメソッドを呼び出すことで、おそらく実行中にクエリを呼び出していることだと思います。

AsNoTracking拡張メソッドを使用して目標を達成することをお勧めします。

つまり、関数の戻り値を次のように記述します。

return db.Customers.Where(it => it.customer_Id > 10).AsNoTracking().ToList();
于 2013-01-19T21:12:45.520 に答える
2

単一の接続文字列を使用してこれらすべての db コンテキストを作成しているためですか?

いいえ、単一の接続文字列の結果ではありませんDataContextCreator.Instance.Create()。同じ接続に基づいてコンテキストが返されると想定しています。DataContextCreatorコードを提供できますか? 特にプロパティInstance

于 2013-01-19T21:17:53.040 に答える