繁体   English   中英

检查导航属性是否已加载

[英]Check if navigational property is loaded

是否可以检查导航属性是否已加载? 当我尝试访问它时,我只会得到一个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仍然被处置,而这就是实体所绑定的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM