ObjectDisposed异常:我在MVC 3 EF深度加载中做错了什么?

时间:2012-05-18 03:43:56

标签: asp.net-mvc-3 entity-framework-4 linq-to-entities entity-framework-4.1

我正在尝试深度加载EF对象并将其保留在缓存中一段时间​​。在我的例子中,我有一个对象(比如User),然后是一个内部的Books集列表作为虚拟集合

public virtual ICollection<Books> ListOfBooks { get; set; }

书籍和用户之间存在外键关系(并且一切正常)

我正试图在静态中心类中深入加载

public static List<User> LoadAllBooksAndUsers() {

  using (MyDB dc = new MyDB())
  {

      dc.Users.Include("ListOfBooks");
      List<User> a = dc.Users.Where(l => l.Status == 1).ToList();

      return a;             
   }
}

在我的通话代码中,我有类似的内容:

var evx = DB.LoadAllBooksAndUsers();
var q = evx.Single(m=>m.name==name);

在调试器或q.ListOfBooks中检查evx表明listOfBooks有一个被处置异常的对象,它是null。

这是随机的 - 它似乎偶尔会起作用,我不知道在什么条件下。

我对发生的事情毫无头绪 - 我的理解是使用.Include()然后枚举它将加载所有依赖的外键对象,那么为什么不将所有书籍深入加载到用户?我错过了什么?

(我想深度加载这个对象并将其缓存一段时间,因为其中的数据经常被使用)

1 个答案:

答案 0 :(得分:3)

您使用的是Include错误。您需要将它与查询构建本身一起使用:

List<User> a = dc.Users.Include("ListOfBooks")
                       .Where(l => l.Status == 1)                           
                       .ToList();

您可以找到有关预先加载的更多信息in this article