2009-09-14 59 views
1

我有一個簡單的父 - 子情境,父母可以有多個孩子。用戶可以通過從列表框中選擇或取消選擇來更新孩子的列表。我嘗試使用類似下面的代碼更新子列表,但我得到的SQLException:使用LINQ to SQL管理子列表

違反PRIMARY KEY約束 「PK_Child_1」的。不能在對象'dbo.Child'中插入重複的 鍵。

看來,LINQ插入新的孩子之前刪除現有的。我確信有一個簡單的模式來處理這個,但我很難過。

context.DeleteAllOnSubmit(parent.Children); 
foreach (string childname in listBox1.SelectedItems) { 
    parent.Children.Add(new Child(parentkey, childname)); 
} 
context.SubmitChanges(); 

每個父項都有一個唯一鍵(GUID),並且所有父列和子列都不可爲空。子表是一個帶有父鍵和varchar值的簡單兩列表,其中一個複合主鍵由兩列組成。

謝謝

+0

它是實體框架對嗎? – 2012-10-26 07:58:33

回答

4

問題是,你要添加新的項目之前,舊的已刪除。

LINQ到SQL有着明確的規定上SubmitChanges()調用操作的順序(你一定要同時使用SubmitChanges() - 不Save()!):

* Inserts 
* Updates 
* Deletes 

(僅供參考,請參閱herehere

這裏的麻煩是 - 您似乎添加了與您在DeleteAllOnSubmit()調用中刪除的鍵相同的鍵的子節點。

但是由於新項目的INSERT在刪除之前出現,所以最終會出現衝突。

你需要做的是兩兩件事之一:

  • 要麼你刪除的子節點,然後調用SubmitChanges()前再增加新的項目

OR:

  • 你改變你的邏輯,以便仍然存在的子節點不首先被刪除然後重新添加;改變你的邏輯刪除被真正刪除(不加回)的項目,並且只能插入那些真正的新

使用任的這兩個步驟,你應該讓你的系統工作。

Marc