2012-09-24 173 views
0

我有一個實體框架模型,有3個表(每個都有縮進主鍵)。根表與子表具有一對多關係,該子表與子表具有一對多的關係。該模型在從數據庫生成的模型中正確反映。實體框架4.1關係和插入?

在代碼中,我們對父表執行Insert(Add),然後插入那些子表的表格,最後我們插入到子表的子表中。該代碼看起來類似於下面的示例:

foreach(var parentItemDTO in someDTOCollection) { 
    foreach(var someChildDTOItem in someChildDTOCollection) { 
     // Do some mapping here to the childEntity from DTO 
     // The foreign key relationship isn't set during mapping. 

     childTable.Insert(childEntity); // Underlying code is _dbSet.Add(entity) 

     foreach(var someChildChildDTOItem in someDTOChildChildCollection) { 
      // Do some mapping here to childChildEntity from DTO 
      // The foreign key relationship isn't set during mapping. 

      childChildTable.Insert(childChildEntity); // Underlying code is _dbSet.Add(entity) 
     } 
    } 

    // Do mapping here of the parentEntity from DTO 

    parentTable.Insert(someEntity); // Underlying code is _dbSet.Add(entity) 
} 

插入數據庫似乎工作。但是,我想要了解的是,在映射過程中,EF如何保持這些對象的關係,而無需明確定義外鍵關係?這些插入範圍是否安全?這是否會導致孤兒或孩子被插入錯誤的父母(現在我們沒有看到這種情況發生,但它是否有潛力)?

謝謝!

編輯(校正):

的代碼已被更新,以反映父插件發生後所有的孩子插件。

+1

哦,肖恩,實際插入不發生,直到你調用的SaveChanges()。當您將對象添加到DbSet時,EF只會開始在內存中跟蹤它,只有當您保存所有實體時纔會寫入數據庫。此時,EF會發現父實體需要首先被保存,而不是將其PK用作子實體中的FK。這是你想知道的嗎? – LeffeBrune

回答

1

對於要由EF正確跟蹤的實體,您需要具有表示實體之間關係的屬性。您的父母實體應該有一個引用兒童的屬性,而兒童則應該擁有引用其子女的屬性。例如:

class ParentEntity { 
    public int Id { get; set; } 
    public ICollection<ChildEntity> Children { get; set; } 
} 

class ChildEntity { 
    public int Id { get; set; } 
} 

只要你添加子實體父母的孩子集合EF可以跟蹤的關係:

var parent = new ParentEntity(); 
parent.Children.Add(new ChildEntity()); 
parent.Children.Add(new ChildEntity()); 

EF知道在parent.Children集合對象引用代表新的實體(實體不附在上下文中)並將相應地處理它們。除非調用SaveChanges(),否則實際插入數據庫不會發生。當你添加一個對象到DbSet時,EF剛開始跟蹤它在內存中的位置。只有當你調用SaveChanges()實體時纔會寫入數據庫。此時,EF會發現需要首先保存父實體。然後它會在您的子實體中使用父實體的PK作爲FK。現在你可以添加父上下文,這也將增加兒童:

context.Set<ParentEntity>().Add(parent); 
context.SaveChanges(); // adds parent and two children. 
+0

POCOs確實在其中定義了集合,並且子集確實也在其中定義了父實體。然而,第二部分沒有出現在我們的代碼中(最後一部分是),但我們的子實體仍然正在正確地插入,並且父主鍵作爲子表中的外鍵。這裏還有其他的東西在我們失蹤?引擎蓋下正在發生什麼?注:更新代碼以反映該插入的父項插入子項後發生(這是在上下文中.DbSet )。 – Sean

+0

如果您將子實體添加到父級集合,或者將子級父級引用設置爲父實體EF,則可以計算出您的關係。當您保存父項時,它將跟隨.net對象引用並發現所有依賴實體並正確插入它們。 – LeffeBrune

+0

好的。這解釋了它!謝謝。 – Sean