Entity framework 4 实体框架POCO T4有时创建EntityCollection,有时创建FixUpCollection
我在POCO T4模板创建的实体框架POCO中遇到了一个奇怪的问题—对于某些对象,它们的集合属性被创建为Entity framework 4 实体框架POCO T4有时创建EntityCollection,有时创建FixUpCollection,entity-framework-4,poco,t4,Entity Framework 4,Poco,T4,我在POCO T4模板创建的实体框架POCO中遇到了一个奇怪的问题—对于某些对象,它们的集合属性被创建为EntityCollection,而对于其他对象,它们被创建为FixUpCollection 我发现有三个类对产品层次结构建模产品组,平台和产品。每个产品组都有一个平台s的集合,每个平台都有一个产品s的集合。所有的关系都是双向的。集合getter和setter对于每个类都是完全相同的,因为它们是由T4模板生成的,所以它们看起来(例如)都是这样的: public virtual ICollect
EntityCollection
,而对于其他对象,它们被创建为FixUpCollection
我发现有三个类对产品层次结构建模<代码>产品组,平台
和产品
。每个产品组
都有一个平台
s的集合,每个平台
都有一个产品
s的集合。所有的关系都是双向的。集合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 { ... }
}
公共虚拟ICollection平台
{
得到
{
如果(_platforms==null)
{
var newCollection=newfixupcollection();
newCollection.CollectionChanged+=固定平台;
_平台=新集合;
}
返回平台;
}
集合{…}
}
有趣的是,Product
和Platform
上的所有集合都创建为EntityCollection
s,而ProductGroup
上的所有集合都创建为FixUpCollection
s。i、 e.当代码第一次进入(例如,平台.Products
的getter时,\u Products
字段已经填充了一个EntityCollection
,但是当它第一次进入上面显示的getter时,\u平台
为空,并且创建并随后填充了一个FixupCollection
。延迟加载在这两种情况下都有效,它只是以两种不同的方式工作
实体
对象启用了延迟加载和代理创建Product
、Platform
和CoreProduct
对象都是实体.DynamicProxies
命名空间中的动态EF代理。我已经尝试过急切地加载平台
和产品组
,这没有什么区别。我看不出在模型查看器中设置类的方式有什么不同
这让我很头疼,因为ProductGroup
上的一个集合包含数千个对象,我想查询该集合。据我所知(如果我错了,请纠正我),我无法在不将所有对象加载到内存的情况下查询FixUpCollection
,而EntityCollection
则不是这样,因为我可以使用。以前有人见过这种行为吗?有没有什么地方我错过了?任何指点或帮助都将不胜感激
如果不将所有对象加载到中,我无法查询FixUpCollection
内存,而EntityCollection则不是这种情况
在查询方面,FixUpCollection
和EntityCollection
之间没有区别<代码>EntityCollection由动态代理用于延迟加载,如果您尝试查询此类型的属性,延迟加载仍将加载所有记录,并且查询将作为Linq to对象执行
您的问题很可能与创建延迟住宿代理有关。谢谢您的回答-我更新了我的问题,以澄清我所说的
FixUpCollection
和EntityCollection
(提供CreateSourceQuery()
)的不同“可查询性”是什么意思。Platform.Products
和ProductGroup.Platforms
属性是以完全相同的方式创建的——由数据库关系中的EF创建,然后由POCO T4模板创建,所以我想不出为什么它们会有所不同。我将进一步研究它,看看我能找到什么…我很好奇您使用的是什么模板造成了这个问题。我使用的是来自的POCO模板,它们似乎没有创建这两种对象类型。你使用的是来自不同来源的模板吗?我很确定这些都是我使用的模板-该网站注意到“POCO生成器已经更新”,所以可能是旧版本。。。它是ModelGenerator.tt文件,其中包含FixUpCollection
类的定义。