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

时间:2013-02-18 15:32:22

标签: entity-framework-4 lazy-loading objectcontext

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

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

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

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

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

马特拉

2 个答案:

答案 0 :(得分:1)

看起来这是在此更改中实现的: http://entityframework.codeplex.com/workitem/269

您现在可以遍历您的实体并告诉他们已经加载了他们的子集合:

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

这将阻止SomeChildCollection中的实体从entity访问时加载。{/ p>

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

答案 1 :(得分:0)

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