Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查是否加载了导航属性_C#_Entity Framework - Fatal编程技术网

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
}