检查是否已加载导航属性

时间:2014-03-20 21:46:31

标签: c# entity-framework

是否可以检查是否已加载导航属性?当我尝试访问它时,我只得到ObjectDisposedException

  

ObjectContext实例已被释放,不能再用于需要连接的操作。

public class Factory {
    // ..
    public virtual ICollection<Machine> Machines { get; set; }
}

// ...
IList<Factory> set;
using (MyContext context = new MyContext()) {
    set = context.Factories.ToList();
}

... later on

// Is it possible to check if .Machines is loaded here?
if (set.First().Machines == Loaded)

    // Let's open a new context and load it then
}

我在搜索时找到的解决方案是使用Include()并在第一次运行中包含机器,但我希望避免在必要时加载它。我也尝试用新的using(...){}来装箱,但我仍然得到例外 我还想避免使用Attach,因为在构建大型对象图时它非常慢。

我想我可以使用bool IsMachinesLoaded或其他东西,但我认为应该有一些方法可以在没有它的情况下进行检查..

2 个答案:

答案 0 :(得分:4)

我用一种方法解决了它:

protected bool IsLoaded<TEntity>(TEntity entity, Func<TEntity, object> testAction)
{
    try
    {
        testAction(entity);
        return true;
    }
    catch (ObjectDisposedException)
    {
        return false;
    }
}

通过以下方式调用:

if (IsLoaded(myEntity, entity => entity.MyList)){
    // the navigational property exists and can be accesses
}

答案 1 :(得分:0)

您必须在原始DataContext范围内阅读.Machines,或在.Include中指定Machines。

原因是您在获取计算机之前处置了DbContext。当你试图获取时,它没有上下文这样做。因此ObjectDisposedException。

你不能只使用它将其包装在另一个中,因为原始的DbContext仍然处理掉,这就是实体绑定的内容。