MVC3,EF4和使用块

时间:2011-08-01 20:52:39

标签: asp.net-mvc-3 entity-framework-4

使用实体框架的块的{p> Advocation似乎是popular,但MVC的this教程显示了在类级别创建一次的实体的对象上下文。我先遇到后者,所以我一直在使用它。我现在正在尝试切换到using block方法以查看它是否真的更快,但是在视图中遇到此错误:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

该视图正在尝试访问由此创建的集合:

 homeView.UserList = new SelectList((from n in db.Users where n.US_INACTIVE == 0 orderby n.US_FULL_NAME select n).AsEnumerable(), "US_USER_ID", "US_FULL_NAME");

我不明白为什么它仍然试图从视图中访问对象上下文(当它使用该SelectList时)它应该已经在受控制中填充。更令人困惑的是,其他数据库填充的数据不会出现同样的问题,这似乎使它进入视图就好了。

除此之外,我需要做些什么才能将使用块中的数据正确地放入视图中?或者,使用块是错误的MVC方式,我应该继续使用一次类的对象上下文吗?

2 个答案:

答案 0 :(得分:3)

您可能没有在表达式的末尾调用.ToList,因此您不是急切地执行任何查询而只是构建查询表达式。只有在执行视图时才会隐式执行查询,但这会在控制器生命周期结束后很长时间内发生,并且任何数据上下文都会发生。

这就是说我认为将域模型作为一种不好的做法传递给视图。您应该使用视图模型,这些视图模型是专门针对给定视图的要求而设计的类。

Ayende Rahien关于视图模型的问题series of blog posts。从控制器传递给视图的视图模型必须包含急切初始化和加载数据的所有必需属性,这与您正在使用的数据访问技术无关。顺便说一句,控制器不负责管理EF数据上下文的生命周期。这应该特定于您的数据访问层(存储库)。

答案 1 :(得分:1)

您是否在视图中使用与用户相关的其他表?在当前查询中,将仅填充Users表,并且访问任何相关表中的数据将引发该错误。

homeView.UserList = new SelectList((from n in db.Users.Include("Other Table") where n.US_INACTIVE == 0 orderby n.US_FULL_NAME select n).AsEnumerable(), "US_USER_ID", "US_FULL_NAME");