6

我已經在數據庫中插入了一些父記錄。現在我想添加一些兒童記錄。要做到這一點我也跟着下面的步驟:當父記錄已經存在時,使用實體框架代碼先插入子記錄表中的記錄

  1. 檢索父(A)記錄
  2. 創建一個新的子(B)記錄
  3. 父記錄添加到兒童的導航性能。 B.A = A
  4. 調用SaveChanges。

問題是,當我這樣做EF插入一個新的父,然後添加一個外鍵指向新的新插入的父,而不是隻插入子映射到已經存在的父的孩子。我還在保存孩子時檢查了父母的主鍵,並確實存在於數據庫中。

請注意,我正在使用數據庫生成的父母和孩子的身份。 我注意到的一件事是,如果我從同一個上下文對象中添加/保存父項和子項,那麼它工作正常。

需要儘快解決這個問題。任何幫助將不勝感激。

回答

18

是的,您必須爲該操作使用相同的上下文。這就是我想說的。如果不使用相同的上下文,則必須手動控制將插入哪個對象,哪些對象已更新,哪些不會被修改。在方案中的順序可以是:

context.Parents.Attach(parent); // just attach as unchanged 
context.Childs.Add(child); // add as inserted 
parent.Childs.Add(child); // make connection between existing and inserted object 
context.SaveChanges(); 

另一種方法可以是:

child.Parent = parent; 
context.Childs.Add(child); // both child and parent are marked as inserted!!! 
context.Entry(parent).State = EntityState.Unchanged; // set parent as unchanged 
context.SaveChanges(); 
+1

第二種方法爲我工作。非常感謝。 – Amit

+0

遇到同樣的問題。你可以請看看:http://stackoverflow.com/questions/16131090/the-relationship-could-not-be-changed-the-foreign-key-properties-is-non-nulla/16131494?noredirect= 1個#comment23046042_16131494?我在smae上下文中獲得'MamConfiguration_V1'我保存這些更改。它附在同一個上下文中。流程:通過使用Id獲取MamConfiguration_V1(編輯模式) - >從UI中爲其分配所有值 - >覆蓋\ add \刪除引用成員(導航)MamConfigurationToBrowser_V1。有沒有添加信息? –

+0

+1每天我都會學到新東西,這是迄今爲止我所見過的這個問題的最好解釋。謝謝! –

0

此外,在情況下,當你有這樣的:

public class B 
{ 
[Key] 
public int Id {get;set;} 

public AId {get;set;} 

//... other properties here 

[ForeignKey("AId")] 
public virtual A ParentA {get;set;} 
} 

,你可以只設置外鍵爲DB中現有的A id條目,並且保留ParentA null和context.SaveChanges()它將按預期工作(不會創建另一個A在DB中輸入)。

相關問題