EF:同时包含导航 属性 和排除子导航 属性

EF: Include navigation property and exclude sub navigation property in same time

我有两个实体:

public class Student
{
    public int Id { get; set; }
    public virtual ICollection<Exam> PExams { get; set; }
}
public class Exam
{
    public int Id { get; set; }
    public DateTime Date { get; set; }

    public int PStudentId { get; set; }

    public virtual Student PStudent { get; set; }
}

我在 DBContext 中描述它们:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Exam>()
        .HasRequired(d => d.PStudent)
        .WithMany(d => d.PExams)
        .HasForeignKey(d => d.PStudentId);
}

我关闭延迟加载 Configuration.LazyLoadingEnabled = false; 并在 DBContext 中添加了 Exam 和 Student 的属性。

public DbSet<Exam> Exams { get; set; }
public DbSet<Student> Students { get; set; }

现在我试图获取考试列表。

await m_DataContext.Exams.ToListAsync();

此代码为我提供了具有空属性 PStudent 的考试列表(如预期的那样)。所以我将代码更改为下一个:

await m_DataContext.Exams.Include(d=>d.PStudent).ToListAsync();

我预计我会收到包含 属性 PStudent 和 属性 PStudent 的 PExams 的考试列表,但它有数据(考试列表)。当我包含主导航 属性 时,将子导航 属性 留空我应该更改什么?

这是预期的行为。

EF 填充加载到跟踪图中的任何导航属性。 .Include 所做的是告诉 EF 在导航结束时加载实体 属性 并跟踪它,然后它会自动传播到实体中。

您已经将考试实体加载为查询的一部分,因此 link 和反向会自动填充。

我怀疑(但还没有尝试过)如果您使用 m_DataContext.Exams.AsNoTracking().Include(d=>d.PStudent),则可能不会填充反向 属性,但这实际上取决于 AsNoTracking 的内部实现方式。