Heim > Backend-Entwicklung > C++ > Warum werfen Entity Framework 'Es gibt bereits einen offenen DataReader, der diesem Befehl zugeordnet ist, der zuerst geschlossen werden muss'?

Warum werfen Entity Framework 'Es gibt bereits einen offenen DataReader, der diesem Befehl zugeordnet ist, der zuerst geschlossen werden muss'?

DDD
Freigeben: 2025-01-29 21:56:09
Original
381 Leute haben es durchsucht

Why Does Entity Framework Throw

Entity Frameworks "DataReader" -Fehler: Eine gemeinsame Falle

moderne Entitäts -Frameworks vereinfachen die Datenbankinteraktionen, aber der Fehler "Es ist bereits ein geöffneter DataReader zugeordnet, der zuerst geschlossen werden muss" bleibt ein häufiger Kopfschmerz. Dieser Artikel erklärt die Ursache und liefert eine Lösung.

Betrachten Sie dieses Szenario: Eine Abfrage ruft Kontodaten ab und führt dann eine weitere Verarbeitung durch:

<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>
Nach dem Login kopieren

Die unten gezeigte DateLastUpdated -Methode fügt eine weitere Datenbankabfrage hinzu:

<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>
Nach dem Login kopieren

Das Problem? Die Hauptabfrage öffnet eine DataReader. DateLastUpdated öffnet ein weiteres ohne das erste zu schließen, was zum Fehler führt.

Die Lösung: Mehrere aktive Ergebnissätze (Mars)

Die einfachste Lösung besteht darin, mehrere aktive Ergebnissätze (Mars) in Ihrer Verbindungszeichenfolge zu aktivieren:

<code class="language-csharp">Data Source=myServer;Initial Catalog=myDatabase;MultipleActiveResultSets=true</code>
Nach dem Login kopieren

MARS ermöglicht es der Datenbank, mehrere offene Cursors gleichzeitig zu verarbeiten, den Konflikt zu verhindern und den Fehler "Open DataReader" zu beheben. Dies vermeidet die Notwendigkeit eines manuellen DataReader -Clessure und vereinfacht Ihren Code.

Das obige ist der detaillierte Inhalt vonWarum werfen Entity Framework 'Es gibt bereits einen offenen DataReader, der diesem Befehl zugeordnet ist, der zuerst geschlossen werden muss'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage