ホームページ >バックエンド開発 >C++ >エンティティフレームワークが「最初に閉じなければならないこのコマンドに関連付けられているオープンなデータリーダーがすでにある」とエンティティフレームワークがスローするのはなぜですか?

エンティティフレームワークが「最初に閉じなければならないこのコマンドに関連付けられているオープンなデータリーダーがすでにある」とエンティティフレームワークがスローするのはなぜですか?

DDD
DDDオリジナル
2025-01-29 21:56:09382ブラウズ

Why Does Entity Framework Throw

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

問題? メインクエリがa
<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。