1. ホーム
  2. Linq

[解決済み】Entity Framework。このコマンドに関連するオープンなDataReaderがすでに存在します。

2022-04-14 09:15:21

質問

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は、すでに開いている接続を再利用しないのでしょうか。

解決方法は?

接続を閉じることではありません。EFは接続を正しく管理しています。この問題の私の理解は、1つの接続で複数のデータ検索コマンドが実行され(または複数の選択を伴う単一のコマンド)、最初のものが読み込みを完了する前に次のDataReaderが実行されることである。この例外を回避する唯一の方法は、複数のネストしたDataReaderを許可すること = MultipleActiveResultSetsをオンにすることです。また、クエリの結果(IQueryable)を反復処理する際に、反復処理中に読み込まれたエンティティに対してレイジーローディングを実行する場合にも、この現象が発生することがあります。