Entity framework 4 实体框架POCO T4有时创建EntityCollection,有时创建FixUpCollection

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

我在POCO T4模板创建的实体框架POCO中遇到了一个奇怪的问题—对于某些对象,它们的集合属性被创建为
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
类的定义。