2016-01-10 29 views
0

排除子导航属性我有两个实体:EF:包括导航属性和在同一时间

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中的考试和学生。

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

您是否已将“DbSet ”添加到上下文中? –

+0

@IlyaChumakov是的,我忘了提及这一点。 – RredCat

+0

为什么你想要它是空的?它包含了它们,因为它无论如何都是物化的,所以它是有意义的。 –

回答

1

这是预期的行为。

EF填充加载到跟踪图中的任何导航属性。什么.Include的作用是告诉EF在导航属性的末尾加载实体,并跟踪它,然后将其自动传播到实体中。

您已经将考试实体加载为查询的一部分,以便自动填充链接和相反内容。

我有一个怀疑(但还没有尝试过),如果您使用m_DataContext.Exams.AsNoTracking().Include(d=>d.PStudent)反向属性可能不会填充,但它确实取决于如何AsNoTracking内部实现。

+0

有趣,但这不起作用。感谢您的导航属性的解释工作。 – RredCat