使用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