C# 检查是否加载了导航属性
是否可以检查导航属性是否已加载?当我试图访问它时,我只得到一个C# 检查是否加载了导航属性,c#,entity-framework,C#,Entity Framework,是否可以检查导航属性是否已加载?当我试图访问它时,我只得到一个ObjectDisposedException ObjectContext实例已被释放,不能再用于需要连接的操作 公共类工厂{ // .. 公共虚拟ICollection计算机{get;set;} } // ... IList集; 使用(MyContext context=new MyContext()){ set=context.Factories.ToList(); } ... 后来 //可以检查一下机器是否装在这里吗? if(s
ObjectDisposedException
ObjectContext实例已被释放,不能再用于需要连接的操作
公共类工厂{
// ..
公共虚拟ICollection计算机{get;set;}
}
// ...
IList集;
使用(MyContext context=new MyContext()){
set=context.Factories.ToList();
}
... 后来
//可以检查一下机器是否装在这里吗?
if(set.First().Machines==已加载)
//让我们打开一个新的上下文并加载它
}
我在搜索时找到的解决方案是使用Include()
,只在第一次运行时包含机器,但我希望避免在必要时加载它。我还尝试使用(…){}将其放入一个新的框中,但仍然得到了异常。
我还希望避免使用Attach
,因为它在构建大型对象图时非常慢
我想我可以使用一个bool IsMachinesLoaded
或其他什么东西,但我认为应该有某种方法来检查它,而不必这样做。您必须阅读原始DataContext范围内的.Machines,或在.Include中指定Machines
这样做的原因是,在获取机器之前,您正在处理DbContext。当您试图获取时,它没有上下文可供使用。因此,ObjectDisposedException
您不能仅使用另一个来包装它,因为原始DbContext仍处于释放状态,而这正是实体绑定到的对象。您必须读取原始DataContext范围内的.Machines,或在.Include中指定Machines
这样做的原因是,在获取机器之前,您正在处理DbContext。当您试图获取时,它没有上下文可供使用。因此,ObjectDisposedException
您不能仅使用另一个方法将其包装,因为原始DbContext仍处于释放状态,而这正是实体绑定到的对象。我使用以下方法解决了此问题:
protected bool IsLoaded<TEntity>(TEntity entity, Func<TEntity, object> testAction)
{
try
{
testAction(entity);
return true;
}
catch (ObjectDisposedException)
{
return false;
}
}
我用一种方法解决了它:
protected bool IsLoaded<TEntity>(TEntity entity, Func<TEntity, object> testAction)
{
try
{
testAction(entity);
return true;
}
catch (ObjectDisposedException)
{
return false;
}
}
选民能解释一下吗?我已经做了研究,没有找到有效的解决方案。我尝试过不同的方法,但都不让我满意。我遇到了一个小小的死胡同,我正在寻求帮助。我错过了什么吗?不是我的DV,但那个条件有什么意义?访问Machines
会抛出,因为您已经处理了上下文,或者它是一个集合--可能是空的,但它永远不能为null
,因为它是按需自动加载的。@Jon hm。。我从没想过。当我在VisualStudio中悬停Machines
属性时,我想我曾经看到过null
,并认为这是一个“有效”值。虽然我知道您是正确的,但悬停该属性会显示异常。我将编辑问题以突出这是我的问题。请投票人解释一下好吗?我已经做了研究,没有找到有效的解决方案。我尝试过不同的方法,但都不让我满意。我遇到了一个小小的死胡同,我正在寻求帮助。我错过了什么吗?不是我的DV,但那个条件有什么意义?访问Machines
会抛出,因为您已经处理了上下文,或者它是一个集合--可能是空的,但它永远不能为null
,因为它是按需自动加载的。@Jon hm。。我从没想过。当我在VisualStudio中悬停Machines
属性时,我想我曾经看到过null
,并认为这是一个“有效”值。虽然我知道您是正确的,但悬停该属性会显示异常。我将编辑问题以突出这是我的问题。我明白了。。那么这些实体实际上是“绑定”到它们的原始DbContext
的,是吗?我没想到。正如我指定的,我对最初加载它不感兴趣,因为它们将在以后使用。没有其他方法可以验证它是否已加载?如果您将它附加到另一个上下文中,您可以将它包装到另一个上下文中。@Shoe谢谢,但正如我所说的,在构建那些大型对象图时,Attach
可能非常慢,所以我不能真正使用它。我一开始确实走了这条路,但当加载实体花费超过1分钟(对我来说,这应该不超过2秒)时,它变得难以忍受,所以现在你知道了你拥有的不同选项,没有一个是你真正想要的。选一个最不烂的我明白了。。那么这些实体实际上是“绑定”到它们的原始DbContext
的,是吗?我没想到。正如我指定的,我对最初加载它不感兴趣,因为它们将在以后使用。没有其他方法可以验证它是否已加载?如果您将它附加到另一个上下文中,您可以将它包装到另一个上下文中。@Shoe谢谢,但正如我所说的,在构建那些大型对象图时,Attach
可能非常慢,所以我不能真正使用它。我一开始确实走了这条路,但当加载实体花费超过1分钟(对我来说,这应该不超过2秒)时,它变得难以忍受,所以现在你知道了你拥有的不同选项,没有一个是你真正想要的。选择一个吸得最少的。
if (IsLoaded(myEntity, entity => entity.MyList)){
// the navigational property exists and can be accesses
}