是否可以检查是否已加载导航属性?当我尝试访问它时,我只得到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
或其他东西,但我认为应该有一些方法可以在没有它的情况下进行检查..
答案 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仍然处理掉,这就是实体绑定的内容。