我正在尝试深度加载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()然后枚举它将加载所有依赖的外键对象,那么为什么不将所有书籍深入加载到用户?我错过了什么?
(我想深度加载这个对象并将其缓存一段时间,因为其中的数据经常被使用)
答案 0 :(得分:3)
您使用的是Include
错误。您需要将它与查询构建本身一起使用:
List<User> a = dc.Users.Include("ListOfBooks")
.Where(l => l.Status == 1)
.ToList();
您可以找到有关预先加载的更多信息in this article。