检查是否加载了导航属性

本文关键字:导航 属性 加载 是否 检查 | 更新日期: 2023-09-27 17:51:16

是否可以检查导航属性是否已加载?当我试图访问它时,我只得到一个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或其他东西,但我认为应该有一些方法来检查它没有…

检查是否加载了导航属性

我用一个方法解决了这个问题:

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
}

您必须在原始DataContext作用域中读取。Machines,或者在。include .

中指定Machines。

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

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