Хранит ли Entity Framework свой DbContext вместе с планами кэшированных запросов? - PullRequest
0 голосов
/ 27 сентября 2011

В моем веб-приложении мы используем DbContext для каждого запроса.Мы создаем DbContext в Application_BeginRequest (), сохраняем его в HttpContext.Items, а затем вызываем Dispose для него в Application_EndRequest ().

Мы делаем текущий контекст доступным через свойство класса обертки DatabaseContext.Current.

Спорадически при выполнении запроса к этому контексту базы данных мы получаем следующее исключение:

«Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения».

Я искал в нашем коде любую возможность, которую мы вызываем Dispose в контексте в другом месте ... мы не являемся.

Запрос, который обычно терпит неудачу, таков:

var user = (from u in DatabaseContext.Current.Users
           where u.UserName == username
           select u).FirstOrDefault();
return user != null;

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

Есть ли способ отключить кэширование запросов linq?У кого-нибудь есть какие-либо подсказки?

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

Это Entity Framework 4.1, использующая Sql CE (сейчас мы скоро перейдем к производственному экземпляру SQL Server).

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Ни один из ваших сценариев не должен был случиться.Вы не упомянули о кешировании.Вместо этого вы должны проверить некоторые возможности:

  • Вы используете контекст после EndRequest или вне текущего HttpRequest scope
  • Вы сохраняете сущность, извлеченную из контекста, где-то в кэшеили сеанс и использование его в другой обработке запроса - это может быть проблемой, поскольку объект может сохранять ссылку на удаленный контекст и использовать его для некоторых операций.

Автоматическое кэширование запросов LINQ отсутствует - это особенностьпланируется в следующем выпуске EF, но эта функция кэширует DbCommand экземпляров, независимых от контекста.

0 голосов
/ 25 сентября 2015

Вы получаете это исключение «Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения» - потому что произошла неудачная транзакция, после которой происходит попытка получить доступ к запросу данных. Поставьте попытку поймать и соблюдайте исключение. точно, есть исключение, которое не обрабатывается должным образом.

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