2013-02-18 45 views
1

背景: 我正在使用EF4和ObjectContext。为了优化复杂对象层次结构的检索,我手动执行数据库查询,然后使用ObjectContext.Translatey<T>(DataReader, entitySetName, mergeOptions.AppendOnly)将数据行转换为实体。然后我使用Attach方法将实体附加到ObjectContext。这也修复了实体之间的关系。如何防止在EntityFramework中导航属性时已经手动加载的实体的延迟加载

问题: 后,一切都被加载并建立我试着从父实体导航到子实体(例如Parent.Childs.First()),但EF访问数据库加载的孩子,即使所有的子实体已经存在于ObjectContext和EntitySet中。它看起来像这样的原因是parent.Childs.IsLoaded被设置为false,这使EF认为它仍然需要加载关系。

问题: 如何判断EF EntitySet是否已被加载?

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

我发现了一个问题,smilar但here它涉及到的DbContext,没有satifying答案;-)

马特拉

+0

我想你应该在加载层次结构后处理你的上下文。 – 2013-02-18 15:47:06

+0

Gert,谢谢,但我需要实体成为ObjectContext的一部分,因为我要对它们进行更改,并且稍后要调用ObjectContext.SaveChanges。 顺便说一句:如果我用MergeOption.NoTracaking翻译对象不会发生延迟加载(因为实体不与ObjectCOntext相关联),但在这种情况下,我也松散跟踪的变化。 – matra 2013-02-18 17:40:52

+0

但你会解决延迟加载问题。您可以通过将对象临时附加到上下文来保存更改。环境应该有一个短暂的寿命。 – 2013-02-18 18:31:59

回答

1

看起来这是在这种变化中实现: http://entityframework.codeplex.com/workitem/269

您现在可以通过你的实体迭代,并告诉他们,他们的孩子集合已经加载:

foreach (var entity in loadedEntities) 
    context.Entry(entity).Collection(a => a.SomeChildCollection).IsLoaded = true; 

这将防止实体SomeChildCollectionentity访问它们时被加载。

我不是很确定什么版本的EF这个出现,但我猜测6.0.0。

+0

是的,我已将更改请求提交给codeplex,并且很高兴看到它已实施;-) – matra 2014-01-27 15:25:09

0

解决这个是关闭延迟加载的唯一途径。您在MSDN上发现的问题询问DbContext,但答案提到无法更改底层库中的值 - ObjectContext API(在您的情况下= = EF4)是底层库。即使在.NET 4.5(EF5)中,设置IsLoaded仍然在公共API上不可用。

+0

Ladislav,作为以上解释,我仍然需要延迟加载尚未加载的其他实体。它看起来像EF6的beta版本还不支持这个,因此,我已经填写了一个功能请求http://entityframework.codeplex.com/workitem/884。 – matra 2013-02-20 14:59:02