【发布时间】:2017-01-01 01:02:03
【问题描述】:
我刚刚开始使用 EF 核心(使用 NPGSQL),并注意到在没有明确使用“包含”的情况下如何加载导航属性的一些奇怪行为。我看到的一个例子:
对象A
对象A->列出对象B |对象A->列出对象C
ObjectB->列出ObjectD
所有的导航属性都设置好了,数据库里有每种类型的item。
我在没有任何包含的情况下对 ObjectA 运行查询,因此导航属性应该为空。事实并非如此。根据查询的不同,有时其中一个会在没有明确包含的情况下被填写(不是两者,只是 ObjectB 或 ObjectC)。如果我做明确的包含,他们都会出现,就像预期的那样。这很烦人,但并不是我看到的真正糟糕的问题。
假设我查询一个 ObjectC。如果我设置了所有导航属性,它会按预期加载 ObjectA,但现在 ObjectA 也加载了它的所有导航属性;也不仅仅是与 ObjectC 相关的内容。 ObjectA 的所有孩子(和他们的孩子)也会回来。这会导致数百个与请求完全无关的项目返回。
这是代码优先的(我正在手动创建数据库,因为 NPGSQL 中的脚手架似乎非常有问题)。下面是如何为我的一个实体建模父关系的示例:
entity
.HasOne<User>(c => c.User)
.WithMany(p => p.Addresses)
.HasForeignKey(c => c.UserId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName<User, Address>("fk_addresses_user");
如果我查询单个地址,则父用户将被拉回,但在此之下,与该用户相关的所有其他地址也将被拉回(这是一个单级关联,但如果地址有任何子级,它们都会被拉回以及)。
我现在很茫然;我唯一能做的就是从我的模型中删除所有子导航属性。
【问题讨论】:
-
导航属性是否定义为
virtual? -
IIRC,Entity Framework 可以选择强制延迟加载(或禁用急切加载)
-
您能否发布一些实际代码,以便我们了解您在做什么?请同时发布您的模型。另外,您能否为您遇到的任何脚手架错误打开问题?目前我还没有发现任何非常严重的事情。
-
@FrancisLord 您确实意识到延迟加载不在 RTM 构建中?请记住,这不是 EF 6,而是 EFC 1.0 docs.efproject.net/en/latest/querying/… 对于根本问题,我想说这种关系是问题的一部分,但没有模型代码的推测。
-
@mvermef 对不起,我不知道这个事实,我错误地认为 EF 6.0
标签: c# entity-framework-core npgsql