Доступ к DataContext после Dispose на страницах/элементах рендеринга

Я случайно получаю ошибки «DataContext, доступ к которым осуществляется после Dispose», но только на страницах/элементах управления aspx и ascx. Существует ли общее правило, согласно которому мне не следует вызывать встроенные методы на страницах, использующих контексты данных?

Я предполагаю, что к тому времени, когда страница отображается и вызывает метод, контекст данных уже был удален?

например на default.aspx

<%= CurrentContent.GetText("Intro") %>

CurrentContent на самом деле является объектом базы данных, на который ссылается файл default.aspx.cs.


person A-Bop    schedule 11.11.2014    source источник


Ответы (1)


предполагая, что вы используете его так

using (MyDbContext ctx = new MyDbContext())
{
    return from r in ctx.Table select r;
}

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

using (MyDbContext ctx = new MyDbContext())
{
    return (from r in ctx.Table select r).ToList();
}

или изменить методы утилизации. Мне нравится привязывать время жизни моего контекста к окружающему объекту, который в вашем случае будет объектом страницы ASP.NET. Сделайте контекст переменной-членом и удалите его в Page.Dispose

person thewyzard    schedule 11.11.2014
comment
Большое спасибо wyz. Мне было интересно, будет ли это учитываться в инструкции using, даже если вы составите список. Приятно видеть, что это так. Это, наряду с некоторым изменением общего дизайна, похоже, решило проблему. - person A-Bop; 12.11.2014