1

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

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

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

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

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

4

1 回答 1

3

你用Include错了。您需要将它与查询构建一起使用,而不是本身:

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

您可以在这篇文章中找到有关预加载的更多信息。

于 2012-05-18T05:06:41.580 回答