我有一个简单的父子情况,父母可以有多个孩子 . 用户可以通过从列表框中选择或取消选择子项列表来随意更新子项列表 . 我尝试使用下面的代码更新子列表但我得到一个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值,复合主键由两列组成 .
谢谢
1 回答
问题是您在删除旧项目之前添加新项目 .
Linq-to-SQL在
SubmitChanges()
调用上有明确定义的操作顺序(你当然也应该使用SubmitChanges()
- 而不是Save()
!):(供参考,见here和here)
这里的问题是 - 您似乎添加了与您在
DeleteAllOnSubmit()
调用中删除的密钥相同的子节点 .但是因为新项目的INSERT在删除之前出现,所以最终会发生冲突 .
你需要做的是两件事之一:
SubmitChanges()
before 再次添加新项目要么:
使用这两个步骤中的任何一个,您都应该让系统正常工作 .
渣