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) の結果を反復処理し、反復処理内で読み込まれたエンティティの遅延読み込みをトリガーする場合です。