2011-11-10 88 views
1

我正在將父項及其子項都發送到我的服務層。更新父項時實體框架更新子項

該模型設置如下:

public class Parent 
{ 
    public int ParentId { get; set; } 
    public ICollection<Child> Children; 
} 

public class Child 
{ 
    public int ChildID {get; set;} 
    public virtual Parent Parent{get;set} 
    public virtual int ParentId{get; set;} 
    public string FirstName { get; set; } 
} 

我想要的行爲是孩子們總是連接到母體,因此,如果一個孩子在未發現連接了數據庫,我們應該刪除它。如果它不存在,請創建它。如果存在,請更新它。

如何在不編寫手動編寫所有這些調用的代碼的情況下完成此任務?喜歡全部刪除,然後重新添加全部。

回答

2

您不需要刪除所有的子項並重新添加它們(如果您有其他實體在數據庫中引用您只想要更新的子項之一,那麼這可能會成爲一個問題。重新添加它會導致違反外鍵約束)。

你真正需要做的是更復雜的:(

必須加載原始對象圖形數據庫中,然後由孩子檢查的孩子,如果它已被刪除,如果是新的,或者如果它已經存在。

它相當適合準確到模型的一個例子是在這裏:

The relationship could not be changed because one or more of the foreign-key properties is non-nullable

實體框架不支持你用一種超然的objec更新數據庫中的對象圖t圖。它提供的唯一支持是更新標量和複雜屬性。對於那些可以使用ApplyCurrentChanges(對於ObjectContext)或Entry(entity).CurrentValues.SetValues(對於DbContext)。後者用於鏈接的例子來更新父項和每個孩子的標量屬性。但更新實體之間的關係是一項手動任務。