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>
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>
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>
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!