背景
我正在使用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有关,没有令人满意的答案; - )
马特拉
答案 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
。