Недавно я обновил EF 6.1.3 до 6.2.0 на одном из наших крупных проектов, и он нарушил значительное количество наших запросов LINQ. Включение MultipleActiveResultSets заставляет все работать нормально, но я изо всех сил пытаюсь понять изменения. Мы используем EF уже много лет и без каких-либо проблем прошли несколько крупных изменений. Если я просто вернусь к 6.1.3, все будет работать так же, как ожидалось, - на самом деле все работает, даже если я явно отключу MARS в 6.1.3.
Позвольте мне привести несколько упрощенных примеров. Первая проблема связана с вложенными запросами:
foreach(var row in dbSet.Where(<condition>))
foreach(var innerRow in otherDbSet.Where(_ => _.Property == row.Property))
Это отлично работает в 6.1.3, но в 6.2.0 выбрасывается исключение "Есть уже открытый DataReader...". Я понимаю природу исключения, и я могу решить это, вызвав ToList() во внешнем запросе, чтобы сначала перенести результаты в память - я не понимаю, почему я не должен был этого делать в 6.1.3 (даже при отключенном MARS). Не всегда желательно просто загрузить весь внешний набор в память.
Это также похоже на ленивые свойства. Например, мы создаем ComboBoxes из простых запросов, таких как:
return db.Collection
.Where(<condition>)
.AsEnumerable()
.Select(_ => new ListItem(_.Id, _.LazyNavigationProperty.Description))
.ToList();
Это отлично работает в 6.1.3, но опять же в 6.2.0 выбрасывается исключение "Есть уже открытое DataReader...". Исправление - теперь мне нужно с нетерпением загрузить свойство навигации.
В конечном счете у меня нет явного вопроса, я просто пытаюсь понять, почему незначительное обновление версии, по-видимому, вызвало серьезные нарушения изменений в обработке запросов.
Двигаясь вперед, это влияет на слишком много запросов для рефакторинга. Когда я изучал проблему, я увидел смутные предупреждения о возможности MARS, но никто не дал ничего конкретного. Есть ли веская причина не включать его?