2012-05-13 29 views
0

我有一個對象的層次結構,看起來是這樣的:包括層次的實體框架查詢

public class Book 
{ 
    public virtual List<Page> Pages { get; set; } 

    public virtual List<Paragraph> Paragraphs { get; set; } 
} 

public class Page 
{ 
    public virtual List<Paragraph> Paragraphs { get; set; } 
} 

我想加載完整的對象層次和我去約,像這樣:

Book book = (from b in context.Books.Include("Pages").Include("Paragraphs") 
    .Include("Pages.Paragraphs") where CONDITION).SingleOrDefault(); 

我發現加載了book.Pagesbook.Paragraphs,但book.Pages[i].Paragraphsnull

檢查數據庫時,數據看起來正確(關聯列全部正確填充)。

我也嘗試了lamda語法,但是當參數是一個集合而不是實體時(例如,可以做這樣的事情:

.Include(s => s.Paragraphs.Select(p => p.Id == 1) 

,但我沒有看到一個人如何可以使用LAMDA語法來指定Paragraphs集合在book.PagesPage應該被加載。

我錯過了什麼,或者這是實體框架的限制嗎?如果這是一個限制,我該如何解決它?

+0

嗯,我想你的模型自己,並有更多的運氣:'book.Pages [I] .Paragraphs'我已經加入到它在前面跑的段落 –

+0

怪我簡化了。我將重新創建我提出的確切問題,並從那裏向前移動,直到某些事情中斷爲止,謝謝您的關注 –

+0

Tur在實際代碼中缺少'virtual'關鍵字。再次感謝幫助我找到問題! –

回答

0

在實際的代碼中(不是爲了提出目標問題而編寫的代碼,我錯過了一個virtual關鍵字,EF並沒有抱怨無法通過.Include("Pages.Paragraphs")加載請求的額外數據,它只是默默無聞地。忽略了該請求

public class Page 
{ 
    public /* was missing: virtual*/ List<Paragraph> Paragraphs { get; set; } 
}