ObjectContext 已处理,不能再使用

ObjectContext is disposed, can not longer used

示例代码:

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 is disposed ... 我不明白为什么。我看到数据已正确加载到列表中,一秒钟后我无法加载导航属性。

我该如何解决这个问题?

编辑

我做什么: 1. 我第一次调用 SetList() 来初始化列表 2. doStuff 一切正常 3. 我用 SetList 重新创建列表 4. 对 doStuff 的下一次调用在尝试使用导航属性时以异常结束:

var temp = list.where ( m=> m.Address.id==addressId).ToList ()

第二次失败,出现异常:ObjectContext 已被释放。 ..

问题可能是默认情况下导航属性是延迟加载。这意味着在您尝试访问它们之前,它们实际上并没有被数据库返回。您用来创建 listObjectContext 被放置在某个地方,这是一件好事,因为您的上下文的生命周期不会太长。

您在 list.where(m => m.Address.id == addressId).ToList() 上的下一次调用错误的原因是因为您将遍历列表并访问 Address 属性。由于尚未加载,EF 将尝试使用 list 中实体的父 ObjectContext 查询数据库。由于释放了父上下文,因此这是不可能的。

完成此操作的更好且可能更高效的方法是在加载 list.

时预先加载 Address 属性

将您的原始查询更改为如下所示:

list = queryContainer.Advices
    .Where(m => /* Some Predicate */)
    .Include(m => m.Address).ToList();