2011-04-12 66 views
19

我有以下模型。帶有標識列的EF代碼第一個親子插入

class Parent 
{ 
    int ParentId (identity column) { get; set; } 
    string ParentName { get; set; } 
    virtual ICollection<Child> Children { get; set; } 
} 

class Child 
{ 
    int ChildId (identity column) { get; set; } 
    string ChildName { get; set; } 
    int ParentID { get ; set; } //foreign key to Parent(ParentID) 
} 

如何在單筆交易中向我的父母和子女插入幾行?基本上我想獲得在父母上生成的身份(比如我在父母中插入一行)並插入具有該值的子行? 如何使用Code First實現這一點?

回答

37

您不應該擔心Parent的ID會插入Child行的值。這應該是足夠了:

var parent = new Parent 
{ 
    // fill other properties 

    Children = new List<Child>() 
} 

parent.Children.add(new Child { /*fill values */); 

dbContext.Parents.Add(parent); // whatever your context is named 
dbContext.SaveChanges(); 

根據記錄,該ID的將調用SaveChanges()後進行分配,所以如果你真的需要的ID,你可以隨時撥打SaveChanges()插入Child實體之前的兩倍。

同樣,這不應該是必要的。

順便說一句,我會建議做外鍵財產ChildParent導航屬性,所以Child類會是什麼樣子:

class Child 
{ 
    public int ChildId { get; set; } // identity column 
    public string ChildName { get; set; } 
    public virtual Parent Parent { get ; set; } //foreign key to Parent 
} 

這樣,你總是可以直接訪問孩子的父母不不得不從數據庫中明確地檢索它(它會被延遲加載)。

+0

您是不是指'SaveChanges'和'dbContext.Parents.Add(parent)'? – 2011-04-12 18:52:57

+0

@Ladislav - 是的,是的,我糾正了我的答案,謝謝。當我回答這個問題時,我正在查看自己的工作單元實施,並且我分心/困惑:) – 2011-04-12 21:06:45

+1

實體框架首先插入父級,然後插入子級。 'insert into parent - > newly_created_pa​​rent_id',然後'insert into child(...,parent_id)values(..._ newly_created_pa​​rent_id)'。我測試了這個,就像你說的那樣,但是我正在尋找說明這種行爲的文檔。或者這太合乎邏輯了,把它放在文檔(MSDN)? – broadband 2016-06-01 07:48:23