Korzystam z Entity Framework i od czasu do czasu dostaję ten błąd.
EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...
Mimo że nie wykonuję żadnego ręcznego zarządzania połączeniami.
ten błąd zdarza się sporadycznie.
kod wywołujący błąd (skrócony dla ułatwienia odczytu):
if (critera.FromDate > x) {
t= _tEntitites.T.Where(predicate).ToList();
}
else {
t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
}
za pomocą opcji Usuń wzór, aby za każdym razem otwierać nowe połączenie.
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());
}
}
wciąż problematyczne
dlaczego EF nie używałby połączenia, jeśli jest już otwarte.
predicate
i jakiehistoricPredicate
zmienne. Odkryłem, że jeśli przejdzieszFunc<T, bool>
doWhere()
niego, to się skompiluje, a czasem zadziała (ponieważ robi to „gdzie” w pamięci). Co powinno się robić to przechodzącExpression<Func<T, bool>>
doWhere()
.