MVC中没有处理对象上下文的最佳实践?

时间:2012-02-17 09:08:25

标签: asp.net-mvc entity-framework

我有一个名为Student的Entity Framework类。它有一个类列表。现在,每当我(从我的视图)引用ViewBag.Student.Classes时,它都会因对象处置异常而失败,因为我的控制器看起来像这样:

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

现在,我知道我也可以在viewbag中传入学生的课程,但是当使用依赖于学生及其细节的强类型部分视图时,这会增加复杂性。

我认为在那里没有“using”关键字是错误的,因为垃圾收集器不会为垃圾收集器留下太多垃圾吗?

我显然做错了什么。但是什么?

2 个答案:

答案 0 :(得分:4)

有两种方法可以解决这个问题:

  • 在查询中使用预先加载(Include方法)并直接从控制器操作传递您需要的所有数据。目前您收到异常,因为您的视图正在尝试触发延迟加载并对数据库执行另一个查询,但上下文已经处理完毕。
  • 延长上下文的生命周期=不要为每个操作创建上下文。为每个控制器创建单个上下文(为每个请求创建新实例)并在控制器的Dispose方法中配置上下文。您还可以从外部注入上下文 - 依赖注入,但这需要一些其他基础结构。

答案 1 :(得分:2)

您可以尝试eagerly loading associations

ViewBag.Student = myObjectContext
    .UserSet
    .Include("Classes")
    .OfType<Student>()
    .FirstOrDefault(s => s.Id == ActiveStudentSignedIn);