2011-02-02 6 views
0

Entity Frameworkを閉じているときに「読み取り」を呼び出します。Entity Frameworkの:<strong>は、DataReaderオブジェクトを</strong></p> <p>を閉じているとき、私は、並列非同期呼び出しと私のサービスを荒れ狂ったとき、私は断続的にこの問題を取得しています「読み取り」の呼び出し:DataReaderのが

私は私の定義されたEFクエリに.ToList()を呼び出すときに読者がアクセスされたことを理解しています。

私はこれを回避するために、EFのクエリを構築する際のベストプラクティスとは何かを見つけるしたい、とsimilar問題。次のように

私のアーキテクチャは次のとおりです。

マイエンティティデータレイヤは、私のエンティティ(_myEntities)をインスタンス化する静的コンストラクタ、と、静的なクラスです。 MergeOptionなどのエンティティのプロパティも設定します。

この静的クラスは、単にエンティティにアクセスするのpublic staticメソッドを公開します。

public static GetSomeEntity(Criteria c) { 
    ... 
    var q = _myEntitites.SomeEntity.Where(predicate); 
    return q.ToList(); 
} 

この

はしばらくの生産に取り組んできましたが、上記のエラーと1 hereは、ESPのクライアントからの重い負荷の下で、断続的に起こります。

私は現在また設定していますMultipleActiveResultSets =接続文字列ではTrueです。

答えて

1

これはすべての問題の原因です。 shared contextを使用せず、共有コンテキストをdata cacheまたは中央データアクセスオブジェクトとして使用しないでください。これはEFの主なルールの1つとして定義する必要があります。また、MARSが必要な理由もあります(以前の質問からの議論は今解決されています)。複数のクライアントが同時に共有コンテキストでクエリを実行すると、同じdb接続上の複数のDataReaderが開きます。

私はあなたの現在の例外を取得する理由はわからないが、私はあなたのデータアクセスアプローチを再設計する必要があることを確信しています。共有コンテキストのデータも変更する場合は、にする必要があります。

+0

もう一度正しく! 最初は、新しいオブジェクトコンテキストリファレンスを作成し、そのプロパティ(トラッキング、タイムアウト)をすべて設定するオーバーヘッドについて心配しましたが、測定されたテストをいくつか実行しましたが、それほど違いはありません。再度、感謝します! –

0
ように以下のコード内で接続タイムアウトを設定しようとすると、データベースからのデータの膨大な量を取得しようとしたときに問題が接続タイムアウトから来るかもしれない

エンティティ5 ((IObjectContextAdapter)この.context).ObjectContext.CommandT imeout = 1800;

他のエンティティ:this.context.Database.CommandTimeout = 1800 。

関連する問題

 関連する問題