【发布时间】:2012-06-04 15:57:27
【问题描述】:
我遇到了一个由 POCO T4 模板创建的实体框架 POCO 的奇怪问题 - 对于某些对象,它们的集合属性被创建为 EntityCollection,而对于其他对象,它们被创建为 FixUpCollection。
我发现这具有三个类,它们对产品层次结构进行建模; ProductGroup、Platform 和 Product。每个ProductGroup 都有一个Platforms 的集合,每个Platform 都有一个Products 的集合。所有的关系都是双向的。每个类的集合 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 上的集合都创建为EntityCollections,所有ProductGroup 上的集合是创建为FixUpCollections。即,当代码第一次进入(例如)Platform.Products 的 getter 时,_products 字段已经填充了一个 EntityCollection,但是当它第一次进入上面显示的 getter 时,_platforms 为空且FixupCollection被创建并随后填充。延迟加载在这两种情况下都有效,它只是以两种不同的方式工作。
Entities 对象启用了延迟加载和代理创建。 Product、Platform 和 CoreProduct 对象都是 Entity.DynamicProxies 命名空间中的动态 EF 代理。我已经尝试过加载Platform 和ProductGroup,这没有任何区别。我看不出模型查看器中类的设置方式有什么不同。
这让我很头疼,因为ProductGroup 上的一个集合包含数千个对象,我想查询那个集合。据我所知(如果我错了,请纠正我)如果不将所有对象加载到内存中,我无法查询FixUpCollection,EntityCollection 不是这种情况,因为我可以使用CreateSourceQuery() .有没有人见过这种行为?我在某处缺少某些设置吗?任何指示或帮助将不胜感激。
【问题讨论】:
-
我很好奇您使用的是什么模板导致了这个问题。我正在使用来自visualstudiogallery.msdn.microsoft.com/… 的 POCO 模板——它们似乎没有创建这些对象类型中的任何一种。您是否使用其他来源的模板?
-
我很确定那些是我正在使用的 - 该网站指出“POCO 生成器已更新”,所以它可能是一个旧版本......它是 ModelGenerator.tt 文件其中包含
FixUpCollection类的定义。
标签: entity-framework-4 poco t4