我遇到了POCO T4模板创建的实体框架POCO的一个奇怪问题 - 对于某些对象,他们的集合属性创建为EntityCollection
,而其他对象则创建了它们作为FixUpCollection
。
我发现这有三个类来模拟产品层次结构; ProductGroup
,Platform
和Product
。每个ProductGroup
都有Platform
个集合,每个Platform
都有Product
个集合。所有的关系都是双向的。每个类的集合getter和setter完全相同,因为它们是由T4模板生成的,所以它们都看起来像这样:(例如):
public virtual ICollection<Platform> Platforms
{
get
{
if (_platforms == null)
{
var newCollection = new FixupCollection<Platform>();
newCollection.CollectionChanged += FixupPlatforms;
_platforms = newCollection;
}
return _platforms;
}
set { ... }
}
有趣的是,所有 Product
和Platform
上的集合被创建为EntityCollection
s,所有 ProductGroup
上的集合创建为FixUpCollection
。即,当代码首次进入(例如)Platform.Products
的getter时,_products
字段已填充EntityCollection
,但当它首次进入上面显示的getter时,{{1} }为null并创建_platforms
并随后填充。延迟加载在两种情况下都有效,它只是以两种不同的方式工作。
FixupCollection
对象启用了延迟加载和代理创建。 Entities
,Product
和Platform
个对象都是CoreProduct
命名空间中的动态EF代理。我已经尝试过加载Entity.DynamicProxies
和Platform
,这没有任何区别。我看不出在模型查看器中如何设置类的任何差异。
这让我很头疼,因为ProductGroup
上的一个集合包含数千个对象,我想查询该集合。据我所知(如果我错了,请纠正我)我无法在不将所有对象加载到内存中的情况下查询ProductGroup
,{{1}不是这种情况因为我可以使用CreateSourceQuery()
。以前有人见过这种行为吗?有什么设置我在某处丢失吗?任何指针或帮助将非常感激。
答案 0 :(得分:1)
如果不加载所有对象,我无法查询FixUpCollection 内存,不是EntityCollection的情况。
在查询方面,FixUpCollection
和EntityCollection
之间没有区别。动态代理使用EntityCollection
进行延迟加载,如果尝试查询此类型的属性,延迟加载仍将加载所有记录,查询将作为Linq-to-objects执行。
您的问题很可能与violating some rule有关,可用于创建延迟代码代理。