【问题标题】:ObjectDisposed exception: What am I doing wrong in MVC 3 EF deep loading?ObjectDisposed 异常:我在 MVC 3 EF 深度加载中做错了什么?
【发布时间】:2012-05-25 15:53:41
【问题描述】:

我正在尝试深度加载 EF 对象并将其在缓存中保存一段时间。就我而言,我有一个对象(比如用户),然后是一个内部书籍列表设置为虚拟集合

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

Books 和 User 之间存在外键关系(一切正常)

我正在尝试在静态中心类中深度加载它

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 有一个对象处置异常并且它为空。

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

我对正在发生的事情一无所知 - 我的理解是使用 .Include() 然后枚举它会加载所有依赖的外键对象,那么为什么该方法不将所有书籍深度加载到用户中?我错过了什么?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是对的。另外,我建议不要返回列表,然后在内存中进行过滤,而是使用一种新方法,通过单个 sql 查询完成整个操作。
    • 谢谢!这正是我想要它做的!只是让你知道:看来我只能做 .Include().Where() 而不是 .Where().Include()。
    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多