Ich verwende Entity Framework und gelegentlich erhalte ich diesen Fehler.
EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...
Auch wenn ich kein manuelles Verbindungsmanagement mache.
Dieser Fehler tritt zeitweise auf.
Code, der den Fehler auslöst (zur besseren Lesbarkeit verkürzt):
if (critera.FromDate > x) {
t= _tEntitites.T.Where(predicate).ToList();
}
else {
t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
}
Verwenden Sie Muster entsorgen, um jedes Mal eine neue Verbindung zu öffnen.
using (_tEntitites = new TEntities(GetEntityConnection())) {
if (critera.FromDate > x) {
t= _tEntitites.T.Where(predicate).ToList();
}
else {
t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
}
}
immer noch problematisch
Warum sollte EF eine Verbindung nicht wiederverwenden, wenn sie bereits geöffnet ist?
predicate
und IhrehistoricPredicate
Variablen haben. Ich habe entdeckt , dass , wenn Sie passierenFunc<T, bool>
zuWhere()
wird es kompilieren und manchmal Arbeit (weil es funktioniert das „wo“ im Speicher). Was Sie tun sollten , istExpression<Func<T, bool>>
zu übergebenWhere()
.