2014-02-18 87 views
0

我有一個多對多的關係設置,使我在我的上下文中;實體框架6代碼首先許多到多選擇始終爲空

protected override void OnModelCreating(DbModelBuilder modelBuilder){ 

     modelBuilder.Entity<Module>().HasMany(m => m.Questions).WithMany() 
      .Map(q => 
      { 
       q.ToTable("Modules_And_Questions"); 
       q.MapLeftKey("ModuleId"); 
       q.MapRightKey("QuestionId"); 
      }); 

     base.OnModelCreating(modelBuilder); 
    } 

    public virtual DbSet<Module> Modules { get; set; } 
    public virtual DbSet<Question> Questions { get; set; } 

執行

_context.Modules.Where(m => m.ModuleId == 3); 

將返回我適當的模塊,但問題的元素爲null。 (在數據庫中檢查這顯示模塊3有40個問題。)

斷點顯示正在命中OnModelCreating。雖然如果有幫助,但我注意到,在模型構建器中錯誤地引用引號中的任何元素都不會導致錯誤,所以我懷疑我正在調用/正確設置它。

那麼爲什麼問題是空的,它應該包含40個問題元素的列表?

回答

1

它不會自行發生。你必須告訴EF你使用Include加載問題:

_context.Modules.Include(m => m.Questions).Where(m => m.ModuleId == 3); 

如果Module.Questions屬性標記爲virtual(見卡夫的例子),它應該正常工作。只要您訪問Module.Questions屬性,問題將立即加載。但是,這將是第二個數據庫查詢,而在使用Include時,問題將與單個數據庫請求中的模塊一起查詢。

+0

如果我使用你提出的語法,我會得到一個錯誤,「不能將Lambda表達式轉換爲鍵入'string'」。 但是使用包含(「問題」)的作品。所以,你的語法應該如何工作,我錯過了某些事情? – Matt

+0

@Matt:對於'Include'的lambda版本,您必須在代碼文件中添加'using System.Data.Entity;'。 – Slauma

1

你作爲一個集合添加到Module類的問題嗎?試試這個

public class Medule 
{ 

    //Constructor 
    public Medule() 
    { 
     Questions = new HashSet<Question>(); 
    } 

    //List of Module properties 
    public ModuleId {get; set;} 


    //Question 
    public virtual ICollection<Question> Questions { get; set; } 

} 
+0

我沒有在構造函數中實例化集合,雖然我有屬性。這意味着我不再有空集合的問題,但它仍然沒有填充。 – Matt