Entity Framework: Es ist bereits ein geöffneter DataReader zugeordnet diesen Befehl, der zuerst geschlossen werden
Diese Frage ist in Bezug auf diese:
Meine repository-Methode hat diesen code:
public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId)
{
return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition) ;
}
Meine Html hat diesen code:
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)
</td>
<td>
@Html.DisplayFor(modelItem => item.applicantPosition.Position.name)
</td>
Die volle Ausnahme ist:
Es ist bereits ein geöffneter DataReader zugeordnet diesen Befehl, der zuerst geschlossen werden.
War es werfen in der ersten Zeile der HTML -
@Html.DisplayFor(modelItem => posten.applicantPosition.Antragsteller.name)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schnelle Lösung :
Wenn Sie wissen wollen, warum diese Fixierung Ihr problem, Lesen Sie, wie LINQ und latente Ausführung funktioniert. In wenigen Worten - wenn Sie nicht "zwingen" die Ausführung der select-von "auflisten" - Abfrage durch, ToList, es ist in der Tat ausgeführt zu spät - im Blick. Und dies verursacht Probleme mit anderen Abfragen, die wollen, verwenden Sie dieselbe Verbindung.
.Include(...)
für diese Eigenschaft in den controller und das hinzufügen von.ToList()
dem Ende meiner übrigen.Include(...)
Aussagen scheint das problem behoben - danke.Haben Sie versucht, indem
MultipleActiveResultSets=true;
zu Ihrem Verbindungs-string?Dieser Fehler tritt auf, wenn eine neue Abfrage wird ausgeführt, während Sie in innerhalb einer anderen Abfrage. Betrachten Sie so etwas wie dies in Ihrer Ansicht
und in Ihrem Gerätemodell haben Sie
dann da für die Bewertung-Gerät.Name it benötigt zur Abfrage von Marke und Modell es werden wird, - Abfrage in Abfrage-und so ist die Lösung zu aktivieren MutlipleActiveResultSets in Ihre Datenbank-Verbindungszeichenfolge wie folgt:
In der Regel nicht verwenden, EF-Objekt in der Ansicht, sondern sorgen Sie für eine POCO-Objekt für die Ansicht, Modell und Karte das Ergebnis der Abfrage auf das view-Modell. EF nicht ausführen der Abfrage im repository-Methode, da die Abfrage nicht ausgeführt, bei der Bestimmung der Zeit, aber nur, wenn Sie, versuchen Zugriff auf die Daten. In Ihrer Ansicht, die Sie mit der gleichen Abfrage die viele Zeit und das ist nicht korrekt.
Wenn Sie möchten, um Zugriff auf die Liste von Objekten zurückgegeben, die durch Ihre repository-Methode, verwenden
toList
Das eigentliche problem, wenn Sie Faul sind, Laden die Position Verweis aus dem ApplicantPosition Person vor der Abfrage endet dieser Ausführung. Wenn Sie möchten, um die verzögerte Ausführung auf diesem Szenario können Sie eifrig laden die Position Verweis auf die Abfrage wie diese:
Gehören(o => o -.applicantPosition.Wählen Sie(ein => ein.Position));
und auf Ihre GetApplicationPositionHistories hält die Rücksendung der IEnumerable-Schnittstelle.
Die andere Lösung ist tatsächlich die Abfrage auf die GetApplicationPositionHistories Aufruf der Methode ToList() oder ToArrray () - Methoden für die Abfrage.