Лучшие практики в MVC, чтобы не избавляться от контекста объекта? - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть класс Entity Framework, который называется Student.У него есть список классов.Теперь, каждый раз, когда я (с моей точки зрения) обращаюсь к ViewBag.Student.Classes, происходит сбой с исключением объекта, поскольку мой контроллер выглядит так:

using(var myObjectContext = new ModelContainer()) {
    ViewBag.Student = myObjectContext.UserSet.OfType<Student>().FirstOrDefault(s => s.Id == ActiveStudentSignedIn);
}

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

Я думаю, что было бы неправильно не иметь там ключевое слово «using»потому что это не оставит слишком много мусора для сборщика мусора?

Я явно что-то делаю не так.Но что?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Есть два способа решить эту проблему:

  • Использовать энергичную загрузку (метод Include в запросе) и передавать все необходимые данные непосредственно из действия контроллера.В настоящее время вы получаете исключение, потому что ваше представление пытается запустить отложенную загрузку и выполнить другие запросы к базе данных, но контекст уже удален.
  • Продлить время жизни вашего контекста = не создавать контекст для каждого действия.Создайте отдельный контекст на контроллер (новый экземпляр создается для каждого запроса) и расположите контекст в методе контроллера Dispose.Вы также можете внедрить контекст в контроллер извне - внедрение зависимостей, но для этого потребуется некоторая другая инфраструктура.
2 голосов
/ 17 февраля 2012

Вы можете попробовать нетерпеливо загружать ассоциации :

ViewBag.Student = myObjectContext
    .UserSet
    .Include("Classes")
    .OfType<Student>()
    .FirstOrDefault(s => s.Id == ActiveStudentSignedIn);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...