检查是否加载了导航属性
本文关键字:导航 属性 加载 是否 检查 | 更新日期: 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仍然被处置,这就是实体绑定的内容。