Глубокое понимание ленивой ошибки загрузки и утилизации в 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.

Мне просто нужно понять, почему мои предположения были неверны .. Спасибо в продвинутом

Ответы на вопрос(3)

Ваш ответ на вопрос