Entity Framework: このコマンドに関連付けられたオープンな DataReader が既に存在します 質問する

Entity Framework: このコマンドに関連付けられたオープンな DataReader が既に存在します 質問する

Entity Framework を使用していますが、時々このエラーが発生します。

EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...

手動で接続管理を行っていないにもかかわらず。

このエラーは断続的に発生します。

エラーを引き起こすコード(読みやすくするために短縮されています):

        if (critera.FromDate > x) {
            t= _tEntitites.T.Where(predicate).ToList();
        }
        else {
            t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
        }

毎回新しい接続を開くために Dispose パターンを使用します。

using (_tEntitites = new TEntities(GetEntityConnection())) {

    if (critera.FromDate > x) {
        t= _tEntitites.T.Where(predicate).ToList();
    }
    else {
        t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
    }

}

まだ問題がある

すでに開いている接続を EF が再利用しないのはなぜでしょうか。

ベストアンサー1

これは接続を閉じることではありません。EF は接続を正しく管理します。この問題について私が理解しているのは、単一の接続 (または複数の選択を含む単一のコマンド) で複数のデータ取得コマンドが実行され、最初の DataReader が読み取りを完了する前に次の DataReader が実行されることにあります。例外を回避する唯一の方法は、複数のネストされた DataReader を許可すること、つまり MultipleActiveResultSets をオンにすることです。これが常に発生する別のシナリオは、クエリ (IQueryable) の結果を反復処理し、反復処理内で読み込まれたエンティティの遅延読み込みをトリガーする場合です。

おすすめ記事