2016-01-10 53 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