gpt4 book ai didi

entity-framework-4 - Entity Framework POCO T4 有时会创建一个 EntityCollection 有时会创建一个 FixUpCollection

转载 作者:行者123 更新时间:2023-12-04 07:59:37 25 4
gpt4 key购买 nike

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

我发现这三个类对产品层次结构进行建模; ProductGroup , PlatformProduct .每个ProductGroup收藏了 Platform s 和每个 Platform收藏了 Product 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 { ... }
}

有趣的是, Product 上的所有合集和 Platform创建为 EntityCollection s,以及 ProductGroup 上的所有集合创建为 FixUpCollection s。即当代码第一次进入(例如) Platform.Products 的 getter 时, _products字段已填充 EntityCollection ,但是当它第一次进入上图所示的 getter 时, _platforms为空且 FixupCollection创建并随后填充。延迟加载在这两种情况下都有效,它只是以两种不同的方式工作。
Entities对象启用了延迟加载和代理创建。 Product , PlatformCoreProduct对象都是 Entity.DynamicProxies 中的动态 EF 代理命名空间。我试过急切加载 PlatformProductGroup ,这没有区别。我看不出在模型查看器中设置类的方式有什么不同。

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

最佳答案

I can't query a FixUpCollection without loading all the objects into memory, which is not the case for an EntityCollection.


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

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

关于entity-framework-4 - Entity Framework POCO T4 有时会创建一个 EntityCollection 有时会创建一个 FixUpCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10815890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com