Entity Framework: Diesem Befehl ist bereits ein offener DataReader zugeordnet, der zuerst geschlossen werden muss

7

Diese Frage bezieht sich auf das :

Meine Repository-Methode hat folgenden Code:

%Vor%

Mein HTML hat diesen Code:

%Vor%

Die vollständige Ausnahme ist:

Diesem Befehl ist bereits ein offener DataReader zugeordnet, der zuerst geschlossen werden muss.

Es wurde in die erste Zeile des HTML geworfen   @ Html.DisplayFor (modelItem = & gt; item.applicantPosition.Applicant.name)

    
Luis Valencia 28.10.2011, 10:19
quelle

5 Antworten

20

Schnelle Lösung:

%Vor%

Wenn Sie wissen möchten, warum dieses Problem behoben wurde, lesen Sie, wie LINQ und Ausführung deaktiviert funktioniert. In wenigen Worten - wenn Sie die Ausführung der Auswahl durch "Enumeration" Abfrage nicht durch ToList "erzwingen", ist es in der Tat zu spät ausgeführt - in Sicht. Und das verursacht Probleme mit anderen Abfragen, die dieselbe Verbindung verwenden möchten.

    
rouen 28.10.2011, 10:39
quelle
12

Haben Sie versucht, MultipleActiveResultSets=true; zu Ihrer Verbindungszeichenfolge hinzuzufügen?

    
hofnarwillie 18.12.2012 18:58
quelle
6

Dieser Fehler tritt auf, wenn eine neue Abfrage ausgeführt wird, während Sie sich in einer anderen Abfrage befinden. Bedenken Sie, dass Sie in Ihrer Sicht so etwas haben.

%Vor%

und in Ihrem Gerätemodell haben Sie

%Vor%

dann, da es für die Auswertung von Device.Name erforderlich ist, seine Marke und sein Modell abzufragen, wird es Abfrage innerhalb der Abfrage und so die Lösung ist zu aktivieren MutlipleActiveResultSets in Ihrer Datenbankverbindungszeichenfolge wie folgt:

%Vor%     
Mohsen Afshin 20.07.2012 10:41
quelle
1

Verwenden Sie im Allgemeinen kein EF-Objekt in der Ansicht, sondern erstellen Sie ein POCO-Objekt für das Ansichtsmodell und ordnen Sie das Abfrageergebnis dem Ansichtsmodell zu. EF führt die Abfrage nicht in Ihrer Repository-Methode aus, da die Abfrage nicht zur Definitionszeit ausgeführt wird, sondern nur, wenn Sie versuchen, auf die Daten zuzugreifen. Ihrer Ansicht nach verwenden Sie dieselbe Abfrage mehrmals und dies ist nicht korrekt.

Wenn Sie auf die Objektliste zugreifen möchten, die von Ihrer Repository-Methode zurückgegeben wird, verwenden Sie toList

    
Max Zerbini 28.10.2011 10:36
quelle
0

Das eigentliche Problem, wenn Sie Lazy sind Laden der Positionsreferenz von der Entität ApplicantPosition, bevor die Abfrage diese Ausführung beendet. Wenn Sie die verzögerte Ausführung für dieses Szenario beibehalten möchten, können Sie den Position-Verweis für Ihre Abfrage wie folgt laden:

Include (o = & gt; o.applicantPosition.Select (a = & gt; a.Position));

und auf Ihrem GetApplicationPositionHistories wird das IEnumerable zurückgegeben.

Die andere Lösung besteht darin, die Abfrage für die GetApplicationPositionHistories-Methode tatsächlich auszuführen, indem die Methoden ToList () oder ToArrray () für die Abfrage aufgerufen werden.

    
marianosz 30.10.2011 15:24
quelle