【问题标题】:MVC3, EF4, and Using blocksMVC3、EF4 和使用块
【发布时间】:2011-08-01 20:52:39
【问题描述】:

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

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 来说,使用块是错误的方式吗,我应该继续为类使用一次对象上下文吗?

【问题讨论】:

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


    【解决方案1】:

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

    话虽如此,我认为将域模型传递给视图是一种不好的做法。您应该使用视图模型,它们是专门为给定视图的要求而设计的类。

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

    【讨论】:

    • 它实际上是一个 ViewModel。 UserList 属性是 SelectList,如第二个代码块所示。 AsEnumerable 不执行查询吗? ToList 是在这个例子中调用的正确方法吗?
    • 另外,我不清楚存储库管理生命周期的责任是什么意思。如果 EF 不管理这个,它是怎么做的?
    • @Tyrsius, AsEnumerable 不执行查询,它从 lambda 表达式返回一个 IEnumerable<T>。存储库是指存储库 Pattetn。它是一个单独的类,您编写实现控制器使用的一些通用接口。当然,特定实现(在您的情况下为 EF)是使用 DI 框架注入到控制器中的,因此在您的控制器内部,您永远不应该编写任何管理任何 DataContextss 的 using 语句。控制器甚至不应该知道 DataContext 是什么......
    • ...这是您当前使用的数据访问技术的特定概念(在您的情况下为 EF)。控制器应该使用域模型、视图模型、调用存储库和服务上的方法。
    • @Darrin,所以在使用 MVC 时,我不应该使用 using 块?
    【解决方案2】:

    您是否在视图中使用了另一个与用户相关的表?在您当前的查询中,只会填充用户表,访问任何相关表中的数据都会引发该错误。

    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");
    

    【讨论】:

    • 这很有趣,但这不是问题所在。不过谢谢你,这可能会在未来有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多