Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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
Entity framework 4 如何防止在EntityFramework中导航属性时延迟加载已手动加载的实体_Entity Framework 4_Lazy Loading_Objectcontext - Fatal编程技术网

Entity framework 4 如何防止在EntityFramework中导航属性时延迟加载已手动加载的实体

Entity framework 4 如何防止在EntityFramework中导航属性时延迟加载已手动加载的实体,entity-framework-4,lazy-loading,objectcontext,Entity Framework 4,Lazy Loading,Objectcontext,背景: 我正在使用EF4和ObjectContext。为了优化复杂对象层次结构的检索,我手动执行数据库查询,然后使用ObjectContext.Translatey(DataReader、entitySetName、mergeOptions.AppendOnly)将数据行转换为实体。然后,我使用attach方法将实体附加到ObjectContext。这也修复了实体之间的关系 问题: 加载并设置完所有内容后,我尝试从父实体导航到子实体(例如parent.Childs.First()),但EF会点击

背景: 我正在使用EF4和
ObjectContext
。为了优化复杂对象层次结构的检索,我手动执行数据库查询,然后使用
ObjectContext.Translatey(DataReader、entitySetName、mergeOptions.AppendOnly)
将数据行转换为实体。然后,我使用
attach
方法将实体附加到
ObjectContext
。这也修复了实体之间的关系

问题: 加载并设置完所有内容后,我尝试从父实体导航到子实体(例如parent.Childs.First()),但EF会点击数据库以加载子实体,即使所有子实体都已存在于ObjectContext和EntitySet中。看起来原因是parent.Childs.IsLoaded设置为false,这使EF认为它仍然需要加载关系

问题: 如何告诉EF EntitySet已经加载

是否有支持的方法将
RelatedEnd.IsLoaded
设置为true。我不想干扰调用
RelatedEnd.SetIsLoaded
内部方法

我发现了一个可笑的问题,但它与DbContext有关,没有令人满意的答案;-)


Matra

解决此问题的唯一方法是关闭延迟加载。您在MSDN上找到的问题是关于
DbContext
的,但答案提到无法更改基础库中的值-ObjectContext API(=您案例中的EF4)是基础库。即使在.NET 4.5(EF5)中,设置
IsLoaded
在公共API上仍然不可用

解决此问题的唯一方法是关闭延迟加载。您在MSDN上找到的问题是关于
DbContext
的,但答案提到无法更改基础库中的值-ObjectContext API(=您案例中的EF4)是基础库。即使在.NET 4.5(EF5)中,设置
IsLoaded
在公共API上仍然不可用

看起来这是在这项更改中实现的:

现在,您可以遍历实体并告诉它们其子集合已加载:

foreach (var entity in loadedEntities)
  context.Entry(entity).Collection(a => a.SomeChildCollection).IsLoaded = true;
这将防止从
entity
访问
SomeChildCollection
中的实体时加载这些实体


我不确定这是在哪个版本的EF中出现的,但我猜是6.0.0。

看起来这是在这个更改中实现的:

现在,您可以遍历实体并告诉它们其子集合已加载:

foreach (var entity in loadedEntities)
  context.Entry(entity).Collection(a => a.SomeChildCollection).IsLoaded = true;
这将防止从
entity
访问
SomeChildCollection
中的实体时加载这些实体


我不确定这出现在哪个版本的EF中,但我猜是6.0.0。

我认为您应该在加载层次结构后处理上下文。Gert,谢谢,但我需要实体成为ObjectContext的一部分,因为我将要对它们进行更改,稍后要调用ObjectContext.SaveChanges。顺便说一句:如果我使用MergeOption.notrack转换对象,则不会发生延迟加载(因为该实体与ObjectCOntext不关联),但在这种情况下,我也会丢失对更改的跟踪。但您将解决延迟加载问题。可以通过将对象临时附加到上下文来保存更改。上下文的生命周期应该很短。Gert,将所有实体分离并重新连接到另一个上下文也会禁用尚未成为上下文一部分的实体的延迟加载(如果我错了,请纠正我)。在我的问题中,我问的是如何“防止已手动加载的实体/关系的延迟加载”。有些实体/关系将不会手动加载,对于它们,我希望保留ObjectContext提供的延迟加载。您也可以通过将父对象临时附加到新上下文来加载对象。如果您想要预加载层次,但不是所有附着的对象,那么这确实是一种方法。另一种方法是保持上下文处于活动状态,并从一开始就使用延迟加载(无需预加载)。我认为您应该在加载层次结构后处理上下文。Gert,谢谢,但我需要实体成为ObjectContext的一部分,因为我将要对它们进行更改,稍后要调用ObjectContext.SaveChanges。顺便说一句:如果我使用MergeOption.notrack转换对象,则不会发生延迟加载(因为该实体与ObjectCOntext不关联),但在这种情况下,我也会丢失对更改的跟踪。但您将解决延迟加载问题。可以通过将对象临时附加到上下文来保存更改。上下文的生命周期应该很短。Gert,将所有实体分离并重新连接到另一个上下文也会禁用尚未成为上下文一部分的实体的延迟加载(如果我错了,请纠正我)。在我的问题中,我问的是如何“防止已手动加载的实体/关系的延迟加载”。有些实体/关系将不会手动加载,对于它们,我希望保留ObjectContext提供的延迟加载。您也可以通过将父对象临时附加到新上下文来加载对象。如果您想要预加载层次,但不是所有附着的对象,那么这确实是一种方法。另一种方法是保持上下文处于活动状态,并从一开始就使用延迟加载(无需预加载)。Ladislav,如上所述,对于其余尚未加载的实体,我仍然需要延迟加载。看起来,即使是EF6的beta版也不支持这一点,因此,我已经填写了一个功能请求。Ladislav,如上所述,对于其余尚未加载的实体,我仍然需要延迟加载。看起来,即使是测试版的EF6也是如此