使用LINQ to SQL管理子列表
我有一个简单的亲子情况,父母可以有多个孩子。 用户可以通过从列表框中选择或取消选择来更新孩子的列表。 我尝试使用下面的代码更新子列表,但我得到一个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值的简单两列表,其中一个复合主键由两列组成。
谢谢
问题在于,在删除旧项目之前添加新项目。
Linq-to-SQL在SubmitChanges()
调用中有一个明确定义的操作顺序(你当然也应该使用SubmitChanges()
- 不是Save()
!):
* Inserts
* Updates
* Deletes
(供参考,请看这里和这里)
这里的麻烦是 - 您似乎添加了与您在DeleteAllOnSubmit()
调用中删除的键相同的键的子节点。
但是由于新项目的INSERT在删除之前出现,所以最终会出现冲突。
你需要做的是以下两件事之一:
SubmitChanges()
要么:
通过这两个步骤中的任何一步,您都可以使系统正常工作。
渣子
链接地址: http://www.djcxy.com/p/40803.html上一篇: Managing child lists with LINQ to SQL
下一篇: Array.Clone() performs deep copy instead of shallow copy