Entity Frameworkの「Open Datareader」エラー:一般的な落とし穴
最新のエンティティフレームワークはデータベースの相互作用を簡素化しますが、エラー「最初に閉じなければならないこのコマンドに関連付けられているオープンなデータリーダーが既にあります」というエラーは頻繁な頭痛のままです。 この記事では、根本原因について説明し、解決策を提供します。
このシナリオを検討してください。クエリはアカウントデータを取得し、さらに処理を実行します。以下に示す
<code class="language-csharp">var accounts = from account in context.Accounts from guranteer in account.Gurantors select new AccountsReport { CreditRegistryId = account.CreditRegistryId, AccountNumber = account.AccountNo, DateOpened = account.DateOpened, }; return accounts.AsEnumerable() .Select((account, index) => new AccountsReport() { RecordNumber = FormattedRowNumber(account, index + 1), CreditRegistryId = account.CreditRegistryId, DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber), AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber) }) .OrderBy(c=>c.FormattedRecordNumber) .ThenByDescending(c => c.StateChangeDate);</code>
DateLastUpdated
<code class="language-csharp">public DateTime DateLastUpdated(long creditorRegistryId, string accountNo) { return (from h in context.AccountHistory where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo select h.LastUpdated).Max(); }</code>
最初のDataReader
を閉じることなく別のDateLastUpdated
を開き、エラーにつながります。
ソリューション:複数のアクティブな結果セット(MARS)
最も簡単な修正は、接続文字列で複数のアクティブな結果セット(MARS)を有効にすることです。
MARSを使用すると、データベースは複数のオープンカーソルを同時に処理できるようになり、競合を防ぎ、「オープンデータウェアヘア」エラーを解決できます。 これにより、マニュアルの閉鎖の必要性が回避され、コードが簡素化されます。以上がエンティティフレームワークが「最初に閉じなければならないこのコマンドに関連付けられているオープンなデータリーダーがすでにある」とエンティティフレームワークがスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。