2009-09-14 68 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