示例代码:
private static list;
public void SetList ()
{
var query = Container.Advices.Where ();
list= query.ToList();
}
public void doStuff ()
{
var temp= list.where (...).ToList ();
}
问题情况:
当我第一次调用SetList时,一切正常。 现在,第二个是SetList调用。我可以在方法中看到,有所有对象,但在第二种方法中,doStuff是抛出的异常:ObjectContext被释放... 我不明白为什么。我看到数据已正确加载到列表中,而不是一秒钟之后我就可以了。 t加载导航属性。
我该如何解决这个问题?
修改
我做什么: 1.我第一次调用SetList()来初始化列表 doStuff一切正常 3.我使用SetList重新创建列表 4.在尝试使用导航属性时,下一次对doStuff的调用以异常结束:
var temp = list.where ( m=> m.Address.id==addressId).ToList ()
第二次失败,异常:处理ObjectContext。 ..
答案 0 :(得分:1)
问题可能是默认导航属性延迟加载。这意味着在您尝试访问它们之前,它们实际上并未由数据库返回。您用来创建ObjectContext
的{{1}}正在某个地方处置,这是一件好事,因为您不会在上下文的生命周期中过长。
list
上的下一个调用错误的原因是您要遍历列表并访问list.where(m => m.Address.id == addressId).ToList()
属性。由于尚未加载,因此EF将尝试使用Address
中实体的父ObjectContext
查询数据库。由于处理了父上下文,因此无法做到这一点。
更好且可能性能更高的方法是在加载list
时急切加载Address
属性。
将原始查询更改为如下所示:
list