实体框架POCO T4有时会创建一个EntityCollection,有时会创建一个FixUpCollection

时间:2012-05-30 12:02:41

标签: entity-framework-4 poco t4

我遇到了POCO T4模板创建的实体框架POCO的一个奇怪问题 - 对于某些对象,他们的集合属性创建为EntityCollection,而其他对象则创建了它们作为FixUpCollection

我发现这有三个类来模拟产品层次结构; ProductGroupPlatformProduct。每个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 { ... }
}

有趣的是,所有 ProductPlatform上的集合被创建为EntityCollection s,所有 ProductGroup上的集合创建为FixUpCollection。即,当代码首次进入(例如)Platform.Products的getter时,_products字段已填充EntityCollection,但当它首次进入上面显示的getter时,{{1} }为null并创建_platforms并随后填充。延迟加载在两种情况下都有效,它只是以两种不同的方式工作。

FixupCollection对象启用了延迟加载和代理创建。 EntitiesProductPlatform个对象都是CoreProduct命名空间中的动态EF代理。我已经尝试过加载Entity.DynamicProxiesPlatform,这没有任何区别。我看不出在模型查看器中如何设置类的任何差异。

这让我很头疼,因为ProductGroup上的一个集合包含数千个对象,我想查询该集合。据我所知(如果我错了,请纠正我)我无法在不将所有对象加载到内存中的情况下查询ProductGroup,{{1}不是这种情况因为我可以使用CreateSourceQuery()。以前有人见过这种行为吗?有什么设置我在某处丢失吗?任何指针或帮助将非常感激。

1 个答案:

答案 0 :(得分:1)

  

如果不加载所有对象,我无法查询FixUpCollection   内存,不是EntityCollection的情况。

在查询方面,FixUpCollectionEntityCollection之间没有区别。动态代理使用EntityCollection进行延迟加载,如果尝试查询此类型的属性,延迟加载仍将加载所有记录,查询将作为Linq-to-objects执行。

您的问题很可能与violating some rule有关,可用于创建延迟代码代理。