EF Core中AutoInclude仅对单个导航属性生效问题求助
问题分析与解决
问题背景
我创建了一个包含双向多对多关联的数据库:Parent与Child、Reference与Parent均为双向多对多关联。创建ParentItem并添加Child和Reference后,所有数据都已成功写入数据库表中,但从数据库读取ParentItem时,Child属性能正常填充,References属性却为空。
读取实体代码
public EntityParent GetEntityParent(long EntityParentId) { EntityParent serverEntityParent = null; using (EFModelDatabase _DbContext = new EFModelDatabase(DbOptionBuilder.Options)) { try { serverEntityParent = _DbContext.EntityParent.Single(EntityParent => EntityParent.Id == EntityParentId); } catch (Exception ex) { Exception _exception = ex; } return serverEntityParent; } }
EF模型配置代码
modelBuilder.HasDefaultSchema("dbo"); modelBuilder.Entity<EntityChild>() .ToTable("EntityChild") .HasKey(t => t.Id); modelBuilder.Entity<EntityChild>() .Property(t => t.Id) .ValueGeneratedOnAdd() .IsRequired(); modelBuilder.Entity<EntityParent>() .ToTable("EntityParent") .HasKey(t => t.Id); modelBuilder.Entity<EntityParent>() .Property(t => t.Id) .ValueGeneratedOnAdd() .IsRequired(); modelBuilder.Entity<EntityParent>() .HasMany<EntityChild>(p => p.Childs) .WithMany(p => p.ParentChild) .UsingEntity<Dictionary<string, object>>(right => right.HasOne<EntityChild>().WithMany().HasForeignKey("EntityChild_Id").OnDelete(DeleteBehavior.Cascade),left => left.HasOne<EntityParent>().WithMany().HasForeignKey("EntityParent_Id").OnDelete(DeleteBehavior.Cascade),join => join.ToTable("ParentToChilds")); modelBuilder.Entity<EntityParent>().Navigation(e => e.Childs).AutoInclude(); modelBuilder.Entity<EntityReference>() .ToTable("EntityReference") .HasKey(t => t.Id); modelBuilder.Entity<EntityReference>() .Property(t => t.Id) .ValueGeneratedOnAdd() .IsRequired(); modelBuilder.Entity<EntityReference>() .HasMany<EntityParent>(p => p.ParentRef) .WithMany(p => p.References) .UsingEntity<Dictionary<string, object>>(right => right.HasOne<EntityParent>().WithMany().HasForeignKey("EntityParent_Id").OnDelete(DeleteBehavior.Cascade),left => left.HasOne<EntityReference>().WithMany().HasForeignKey("EntityReference_Id").OnDelete(DeleteBehavior.Cascade),join => join.ToTable("RefToParent")); modelBuilder.Entity<EntityReference>().Navigation(e => e.ParentRef).AutoInclude();
问题原因
Childs属性能正常加载是因为你在EntityParent的配置中添加了.Navigation(e => e.Childs).AutoInclude(),让EF自动包含该关联数据。但References属性没有对应的自动包含配置,且查询时也未手动加载,所以EF不会自动填充这个多对多关联的数据。
解决办法
有两种可行方案:
方案1:全局自动包含References关联
在EntityParent的模型配置中添加References导航属性的自动包含:
// 放在EntityParent的配置段中 modelBuilder.Entity<EntityParent>().Navigation(e => e.References).AutoInclude();
方案2:查询时手动加载References
在读取EntityParent的查询语句中,使用Include显式加载References关联:
serverEntityParent = _DbContext.EntityParent .Include(p => p.References) // 手动包含关联数据 .Single(p => p.Id == EntityParentId);
- 方案1适合所有查询都需要加载
References的场景 - 方案2适合仅部分查询需要加载该关联的场景
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

