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. Направете контекста членска променлива и го изхвърлете в Page.Dispose

person thewyzard    schedule 11.11.2014
comment
Страхотно благодаря wyz. Чудех се дали, въпреки че го правите списък, той ще вземе това предвид с израза за използване. Добре е да се види, че го прави. Това, заедно с някои общи промени в дизайна, изглежда са решили проблема. - person A-Bop; 12.11.2014