Глубокое понимание ленивой ошибки загрузки и утилизации в MVC .net
я пытался написать полный подробный ответ на следующий вопрос:Почему «Dispose» работает, а не «using (var db = new DataContext ())»?
поэтому я настроил свой проект, который включает в себя:
Отделы и сотрудники, использующие структуру сущностей
поэтому мой метод действия был такой:
public ActionResult Index()
{
IEnumerable<department> d;
using (var ctx = new ApplicationDbContext())
{
d = ctx.departments;
}
return View(d);
}
естественно ожидать, что это приведет к общей ошибке:
The operation cannot be completed because the DbContext has been disposed
и когда я захотел решить эту проблему, я сделал следующее [чтобы ускорить загрузку вместо простой загрузки]:
public ActionResult Index()
{
IEnumerable<department> d;
using (var ctx = new ApplicationDbContext())
{
d = ctx.departments.toList();
}
return View(d);
}
поэтому я пытался понять вещи под капотом и посмотрел на тип возврата метода View (). и я дошел до следующегоПравильныйпредположения:
1 - модель [d] вызывается в режиме ленивой загрузки внутри оператора using.
2- поэтому, когда модель [d] отправляется в представление для генерации страницы, DbContext уже располагается последней фигурной скобкой оператора using.
3 - мы решаем эту ситуацию, отправляя модель [d] в представление с нетерпением загружая моду.
Затем я продолжил свои предположения, которые оказалисьнеправильно'следующим образом:
4- так как метод View () возвращает объект ViewResult, который также является ActionResult ... тогда я могу сгенерировать этот объект внутри оператора using и затем вернуть его пользователю.
поэтому я сделал следующее:
public ActionResult Index()
{
ActionResult myView;
using (var ctx = new ApplicationDbContext())
{
IEnumerable<department> d = ctx.departments;
myView = View(d);
}
return myView;
}
поэтому я сказал себе сейчас, когда я его запускаю, объект ViewResult [myView] будет уже создан и будет возвращен пользователю, и с ошибкой не возникнет.
Однако я был удивлен, что такая же ошибка произошла:
The operation cannot be completed because the DbContext has been disposed
Я был удивлен, как эта ленивая загрузка действительно ленива и загружается только в последний момент.
Поэтому я продолжилнеправильнопредположения, как следует:
5- может быть, мне нужно заставить метод View () выполнить результат внутри оператора using. поэтому я использовал методExecuteResult(ControllerContext)
.
и теперь я подумал, что могу запустить метод действия без каких-либо ошибок, но снова возникла та же ошибка:
The operation cannot be completed because the DbContext has been disposed.
Итак, мой вопрос сейчас:
где в рамках MVC происходит освобождение от запроса отложенной загрузки !!
или позвольте мне перефразировать мой вопрос следующим образом:
Почему сделалView(d)
Метод выполняет итерацию по объекту [d], когда он находится вне использования оператора, а не когда метод view (d) находится внутри оператора using.
Мне просто нужно понять, почему мои предположения были неверны .. Спасибо в продвинутом