2013-07-26 38 views
6

我在開發樹層次結構時遇到實體框架代碼優先的問題。EF代碼優先。子集合對於父項爲空

我需要在數據庫中存儲一些樹。我的表有三個字段Id,Name和Parent_Id。 我創造了我的解決方案如下類:

public class TreeNode 
{ 
    public TreeNode() 
    { 
     Children = new List<TreeNode>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public virtual IList<TreeNode> Children { get; set; } 

    public virtual TreeNode Parent { get; set; } 
} 

我已經添加了以下配置樹節點類

  modelBuilder.Entity<TreeNode>().HasOptional(c => c.Parent) 
        .WithMany(c => c.Children) 
        .Map(m => m.MapKey("Parent_Id")); 

的問題是,當通過EF返回兒童總是空。

但是,如果檢索某個子節點,通過Parent屬性獲取其父節點,則Children屬性將被正確填充。

我不確定這裏有什麼問題。尋找你的建議。

更新:除了虛擬修飾符的導航性能沒有幫助

回答

7

無論是標誌性的virtual,作爲@Cuong建議。加載父當

public virtual IList<TreeNode> Children { get; set; } 

或急於負載孩子:

var nodes = context.TreeNodes.Include(n => n.Children); 
+0

感謝這將使延遲加載(每次當你將嘗試訪問兒童更多的查詢服務器將執行)。即使使用虛擬屬性兒童也不會被退回。 – lostaman

+0

@lostaman確保上下文啓用延遲加載'context.Configuration.LazyLoadingEnabled = true;' –

+0

Thanks @lazyberezovsky。我有這個選項設置爲false。我將它更改爲true,現在我收到一條錯誤消息:「嘗試訪問Children集合時,已經有一個與此命令關聯的打開的DataReader,它必須先關閉」。 – lostaman