2017-03-28 96 views
0

我試圖與實體框架和代碼優先實現簡單的一對多關係。 我設置一個簡單的方法我的父類:實體框架 - 將子對象添加到父項

public class Parent 
{ 
    [Key] 
    public long ParentId { get; set; } 
    public ICollection<Child> Child { get; set; } 

    public Parent() 
    { 
     Child = new HashSet<Child>(); 
    } 
} 

當然,這是一個簡化版本。 我的子類是父那樣簡單:

public class Child 
{ 
    [Key] 
    public long ChildId { get; set; } 
    public int ParentId { get; set; } 
    public virtual Parent parent { get; set; } 
} 

我的控制器是由EF生成的。 問題是,當我在post方法中創建一個具有父級ID的子級時,該ID在數據庫中設置,但是當我獲得父級時,子級列表爲空。

我已經嘗試添加父的孩子在控制器像這樣:

db.parent.find(child.parentId).Child.Add(child); 

這顯然是沒有效果的。

子對象中的父項爲空,父項中的子項列表爲空。

我怎樣才能得到父母的收藏中的孩子?

謝謝!

+1

你叫context.SaveChanges()? – amyn

+1

您需要將您的「兒童」屬性更改爲「public virtual ICollection Child {get;組; }' –

+0

嗨! 感謝您的關注,我確實打電話給SaveChanges()。 並添加虛擬沒有幫助我的問題。我可能會補充說,我關閉了代理創建,以便序列化結果。 感謝您的編輯了。 –

回答

1

據我所知,禁用代理創建也會影響延遲加載。延遲加載只能在代理類中使用。如果沒有,那麼當您訪問屬性時,EF無法控制。

你可以得到孩子的唯一方法是使用預先加載(使用包括())

+0

嗨,謝謝你的回答! 我試圖包括孩子,但問題是一樣的。 我認爲問題在於孩子不是在父母中設置的,而是僅僅是獲取它。 –

+1

沒有創建代理,您將不會有延遲加載功能。這意味着myParent.Child(以及myChild.Parent)永遠不會被EF填充。你需要明確地將它們添加到數據庫調用中:db.Parent.Include(m => m.Child).SingleOrDefault(m => m.Id == myId)例如) – jparaya