我有一个简单的父子情况,父母可以有多个孩子。用户可以通过从列表框中选择或取消选择子项列表来随意更新子项列表。我尝试使用下面的代码更新子列表,但我得到一个SqlException:
违反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 :(得分:4)
问题是您在删除旧项目之前添加了新项目。
Linq-to-SQL在SubmitChanges()
电话上有明确定义的操作顺序(您当然也应该使用SubmitChanges()
- 而不是Save()
!):
* Inserts
* Updates
* Deletes
这里遇到的麻烦是 - 您似乎添加了与DeleteAllOnSubmit()
调用中删除的子节点具有相同密钥的子节点。
但是因为新项目的INSERT在删除之前出现,所以最终会发生冲突。
您需要做的是以下两件事之一:
SubmitChanges()
OR:
使用这两个步骤中的任何一个,您都应该让系统正常工作。
马克