Я использую Entity Framework и иногда получаю эту ошибку.
EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...
Хотя я не делаю никакого ручного управления соединением.
эта ошибка происходит с перерывами.
код, который вызывает ошибку (сокращен для удобства чтения):
if (critera.FromDate > x) {
t= _tEntitites.T.Where(predicate).ToList();
}
else {
t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
}
используя шаблон Dispose, чтобы каждый раз открывать новое соединение.
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());
}
}
все еще проблематично
почему EF не может повторно использовать соединение, если оно уже открыто.
predicate
иhistoricPredicate
переменные. Я обнаружил, что если вы перейдетеFunc<T, bool>
кWhere()
нему, он будет компилироваться и иногда работать (потому что он делает «где» в памяти). То , что вы должны делать это проходитExpression<Func<T, bool>>
вWhere()
.