Я використовую 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());
}
використовуючи шаблон розпорядження, щоб кожен раз відкривати нове з'єднання.
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()
.