2012-02-17 45 views
0

我有一个名为学生的实体框架类。它有一个类的列表。现在,每次我(从我的观点)是指ViewBag.Student.Classes,它无法与设置例外对象,因为我的控制器看起来是这样的:MVC中不处理对象上下文的最佳实践?

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

现在,我知道我可以只通过在学生也可以在视图包中使用类,但是如果使用依赖学生及其细节的强类型部分视图,这会增加复杂性。

我认为在那里没有“使用”关键字会是错误的,因为这不会为垃圾收集器收集太多的垃圾。

我明显在做错事。但是什么?

回答

4

有解决这个方法有两种:

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

你可以尝试eagerly loading associations

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