Entity Framework: вызов «Read», когда DataReader закрыт - PullRequest
0 голосов
/ 02 февраля 2011

Entity Framework: Вызов «Read», когда DataReader закрыт

Я периодически получаю эту проблему, когда обрабатываю свой сервис параллельными асинхронными вызовами.

Я понимаю, что читатель доступен при вызове .ToList () в моем определенном EF-запросе.

Я хотел бы выяснить, каков наилучший способ построения запросов EF, чтобы избежать этого, и подобных проблем.

Моя архитектура выглядит следующим образом:

Мой слой данных сущностей - это статический класс со статическим конструктором, который создает экземпляры моих сущностей (_myEntities). Он также устанавливает свойства моих объектов, таких как MergeOption.

Этот статический класс предоставляет общедоступные статические методы, которые просто обращаются к сущностям.

public static GetSomeEntity(Criteria c) {
    ...
    var q = _myEntitites.SomeEntity.Where(predicate);
    return q.ToList();
}

Это работало в производственном процессе в течение некоторого времени, но ошибка выше и ошибка здесь происходят периодически, особенно при больших нагрузках от клиентов.

В настоящее время я также устанавливаю MultipleActiveResultSets = True в строке подключения.

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

И это источник всех ваших проблем. Не используйте общий контекст и не используйте общий контекст как кэш данных или центральный объект доступа к данным - это должно быть определено как одно из основных правил в EF. Это также причина, почему вам нужен MARS (наше обсуждение предыдущего вопроса решено сейчас). Когда несколько клиентов выполняют запросы к вашему общему контексту в одно и то же время, он открывает несколько DataReaders для одного и того же соединения с БД.

Я не уверен, почему вы получаете свое текущее исключение, но я уверен, что вы должны изменить свой подход к доступу к данным. Если вы также изменяете данные в общем контексте , вы должны .

0 голосов
/ 18 августа 2017

Проблема может быть связана с тайм-аутом соединения при попытке получить огромный объем данных из вашей базы данных, поэтому попытайтесь установить тайм-аут соединения в своем коде, как показано ниже:

Сущность 5 ((IObjectContextAdapter) this.context) .ObjectContext.CommandT‌ imeout = 1800;

Другая сущность: this.context.Database.CommandTimeout = 1800;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...