EF Core部分属性未填充咨询:两个查询为何结果不一致
问题原因与解决方案
核心问题是未显式配置实体间的复合外键关系,EF无法自动识别Meldung与ErsatzArtikel、Artikel_Meldung与Artikel之间的关联字段,导致Include导航属性加载失效。两个查询的差异是EF执行逻辑与上下文缓存的影响,但本质是关系配置缺失。
具体问题分析
你的Artikel实体使用复合主键(ArtNr + AusfKz),但:
Meldung类中存储了关联字段ErsatzArtNr和ErsatzAusfKz,但未告知EF这是ErsatzArtikel的外键Artikel_Meldung类中存储了ArtNr和Ausfkz,同样未配置与Artikel的复合外键关系
EF默认会尝试用主键字段匹配关联,显然无法正确关联到复合主键的Artikel,导致Include生成的SQL关联逻辑错误,无法加载目标导航属性。
两个查询的差异:
/Artikel/Test:先在数据库层面过滤,EF生成的SQL可能因上下文缓存或查询计划巧合加载到数据,但这是不可靠的/Artikel/Meldung:先加载全量数据到内存再过滤,此时EF没有正确的关联规则,无法填充ErsatzArtikel
修复步骤
在你的DbContext的OnModelCreating方法中添加以下Fluent API配置,明确复合外键关系:
1. 配置Meldung与ErsatzArtikel的关联
modelBuilder.Entity<Meldung>() .HasOne(m => m.ErsatzArtikel) .WithMany() // Artikel没有反向导航到Meldung的ErsatzArtikel,所以用WithMany() .HasForeignKey(m => new { m.ErsatzArtNr, m.ErsatzAusfKz }) .HasPrincipalKey(a => new { a.ArtNr, a.AusfKz });
2. 配置Artikel_Meldung与Artikel的关联
modelBuilder.Entity<Artikel_Meldung>() .HasOne(am => am.Artikel) .WithMany(a => a.Artikel_Meldungen) .HasForeignKey(am => new { am.ArtNr, am.Ausfkz }) .HasPrincipalKey(a => new { a.ArtNr, a.AusfKz });
配置完成后,重新生成迁移并更新数据库,两个查询的ErsatzArtikel都会正确填充。
内容的提问来源于stack exchange,提问作者Tekkion
相关产品推荐
相关产品推荐

