You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:13:17