我有两个实体:
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 and 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将为空,但它有数据(考试列表)。当我包含主导航属性时,如果将子导航属性保留为空,我应该更改什么?
答案 0 :(得分:1)
这是预期的行为。
EF会填充加载到跟踪图中的所有导航属性。什么.Include确实告诉EF在导航属性的末尾加载实体并跟踪它,然后它会自动传播到实体中。
您已经将Exam实体作为查询的一部分加载,因此会自动填充链接和反向。
我有一种怀疑(但尚未尝试过),如果使用m_DataContext.Exams.AsNoTracking().Include(d=>d.PStudent)
,则可能无法填充反向属性,但这实际上取决于内部如何实施AsNoTracking。