【问题标题】:Entity Framework POCO T4 sometimes creates an EntityCollection and sometimes creates a FixUpCollection实体框架 POCO T4 有时会创建一个 EntityCollection,有时会创建一个 FixUpCollection
【发布时间】:2012-06-04 15:57:27
【问题描述】:

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

我发现这具有三个类,它们对产品层次结构进行建模; ProductGroupPlatformProduct。每个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 { ... }
}

有趣的是,所有ProductPlatform 上的集合都创建为EntityCollections,所有ProductGroup 上的集合是创建为FixUpCollections。即,当代码第一次进入(例如)Platform.Products 的 getter 时,_products 字段已经填充了一个 EntityCollection,但是当它第一次进入上面显示的 getter 时,_platforms 为空且FixupCollection被创建并随后填充。延迟加载在这两种情况下都有效,它只是以两种不同的方式工作。

Entities 对象启用了延迟加载和代理创建。 ProductPlatformCoreProduct 对象都是 Entity.DynamicProxies 命名空间中的动态 EF 代理。我已经尝试过加载PlatformProductGroup,这没有任何区别。我看不出模型查看器中类的设置方式有什么不同。

这让我很头疼,因为ProductGroup 上的一个集合包含数千个对象,我想查询那个集合。据我所知(如果我错了,请纠正我)如果不将所有对象加载到内存中,我无法查询FixUpCollectionEntityCollection 不是这种情况,因为我可以使用CreateSourceQuery() .有没有人见过这种行为?我在某处缺少某些设置吗?任何指示或帮助将不胜感激。

【问题讨论】:

  • 我很好奇您使用的是什么模板导致了这个问题。我正在使用来自visualstudiogallery.msdn.microsoft.com/… 的 POCO 模板——它们似乎没有创建这些对象类型中的任何一种。您是否使用其他来源的模板?
  • 我很确定那些是我正在使用的 - 该网站指出“POCO 生成器已更新”,所以它可能是一个旧版本......它是 ModelGenerator.tt 文件其中包含FixUpCollection 类的定义。

标签: entity-framework-4 poco t4


【解决方案1】:

如果不将所有对象加载到其中,我无法查询 FixUpCollection 内存,EntityCollection 不是这种情况。

FixUpCollectionEntityCollection在查询方面没有区别。 EntityCollection 被动态代理用于延迟加载,如果您尝试查询该类型的属性,延迟加载仍然会加载所有记录,并且查询将作为 Linq-to-objects 执行。

您的问题很可能与 violating some rule 创建延迟加载代理有关。

【讨论】:

  • 感谢您的回答 - 我已经更新了我的问题,以澄清我所说的 FixUpCollectionEntityCollection 的不同“可查询性”是什么意思(CreateSourceQuery() 的可用性)。 Platform.ProductsProductGroup.Platforms 属性以完全相同的方式创建 - 由数据库关系中的 EF 然后由 POCO T4 模板创建,所以我想不出它们为什么会有所不同。我会再研究一下,看看我能找到什么......
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多