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 的内部实现方式。
我有两个实体:
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 的内部实现方式。