Asp.net mvc 3 MVC3、EF4和使用块

Asp.net mvc 3 MVC3、EF4和使用块,asp.net-mvc-3,entity-framework-4,Asp.net Mvc 3,Entity Framework 4,对于将块与实体一起使用,框架似乎很简单,但MVC教程在类级别显示了正在创建的实体的对象上下文。我首先遇到了后者,所以我一直在使用它。我现在尝试切换到using block方法,看看它是否真的更快,但在视图上遇到了以下错误: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. 视图正在尝试访问由以下程序创建的集合: hom

对于将块与实体一起使用,框架似乎很简单,但MVC教程在类级别显示了正在创建的实体的对象上下文。我首先遇到了后者,所以我一直在使用它。我现在尝试切换到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时),而它本应该在受控对象中填充。更令人困惑的是,对于其他数据库填充的数据,同样的问题并没有发生,这似乎使它进入视图很好


撇开这一点不谈,我需要做什么才能正确地将数据从using块获取到视图中?或者,对于MVC来说,使用块是错误的方法吗?我应该继续为类使用once对象上下文吗?

您是否在视图中使用与用户相关的另一个表?在当前查询中,仅填充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");

您是否在视图中使用与用户相关的另一个表?在当前查询中,仅填充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");

您可能没有在表达式末尾调用
.ToList
,因此您不急于执行任何查询,而只是构建查询表达式。只有在执行了视图之后,查询才会隐式执行,但这会在控制器生命周期以及任何数据上下文结束后很久发生

我认为将域模型传递给视图是一种错误的做法。您应该使用视图模型,这些模型是专门为给定视图的需求而设计的类


Ayende Rahien对视图模型的问题有自己的看法。从控制器传递到视图的视图模型必须包含所有需要初始化并加载数据的属性,这与所使用的数据访问技术无关。顺便说一句,控制器不负责管理您的EF数据上下文。这应该是特定于您的数据访问层(存储库)的。

您可能没有在表达式末尾调用
.ToList
,因此您不急于执行任何查询,而只是构建查询表达式。只有在执行了视图之后,查询才会隐式执行,但这会在控制器生命周期以及任何数据上下文结束后很久发生

我认为将域模型传递给视图是一种错误的做法。您应该使用视图模型,这些模型是专门为给定视图的需求而设计的类


Ayende Rahien对视图模型的问题有自己的看法。从控制器传递到视图的视图模型必须包含所有需要初始化并加载数据的属性,这与所使用的数据访问技术无关。顺便说一句,控制器不负责管理您的EF数据上下文。这应该特定于您的数据访问层(存储库)。

它实际上是一个ViewModel。UserList属性是SelectList,如第二个代码块所示。AsEnumerable是否不执行查询?在本例中,ToList是调用的正确方法吗?另外,我不清楚存储库管理生命周期的责任是什么意思。如果EF没有管理这个,它是如何完成的?@Tyrsius,
AsEnumerable
不执行查询,它会从lambda表达式返回一个
IEnumerable
。我所说的存储库是指存储库模式。它是一个单独的类,您编写它来实现控制器使用的一些公共接口。当然,特定的实现(在您的例子中是EF)是使用DI框架注入控制器的,因此在您的控制器中,您永远不应该编写任何使用语句来管理任何DataContexts。控制器甚至不应该知道什么是DataContext。。。。。。这是您当前使用的数据访问技术的特定概念(在您的案例中是EF)。控制器应该使用域模型、视图模型、调用存储库和服务上的方法。@Darrin,所以当使用MVC时,我不应该使用块?它实际上是一个视图模型。UserList属性是SelectList,如第二个代码块所示。AsEnumerable是否不执行查询?在本例中,ToList是调用的正确方法吗?另外,我不清楚存储库管理生命周期的责任是什么意思。如果EF没有管理这个,它是如何完成的?@Tyrsius,
AsEnumerable
不执行查询,它会从lambda表达式返回一个
IEnumerable
。我所说的存储库是指存储库模式。它是一个单独的类,您编写它来实现控制器使用的一些公共接口。当然,特定的实现(在您的例子中是EF)是使用DI框架注入控制器的,因此在您的控制器中,您永远不应该编写任何使用语句来管理任何DataContexts。控制器甚至不应该知道什么是DataContext。。。。。。这是您当前使用的数据访问技术的特定概念(在您的案例中是EF)。控制器应该使用域模型、视图模型、调用存储库和服务上的方法。@Darrin,所以当使用MVC时,我不应该使用块?这很有趣,但不是问题所在。不过谢谢你,这可能会对未来有所帮助。这很有趣,但这不是问题所在。不过,谢谢你,这在将来可能会有所帮助