使用LINQ to SQL管理子列表

时间:2009-09-14 21:31:43

标签: 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值,复合主键由两列组成。

由于

1 个答案:

答案 0 :(得分:4)

问题是您在删除旧项目之前添加了新项目。

Linq-to-SQL在SubmitChanges()电话上有明确定义的操作顺序(您当然也应该使用SubmitChanges() - 而不是Save()!):

* Inserts
* Updates
* Deletes

(供参考,请参阅herehere

这里遇到的麻烦是 - 您似乎添加了与DeleteAllOnSubmit()调用中删除的子节点具有相同密钥的子节点。

但是因为新项目的INSERT在删除之前出现,所以最终会发生冲突。

您需要做的是以下两件事之一:

  • 删除子节点,然后再次再次添加新项目之前调用SubmitChanges()

OR:

  • 您更改逻辑,以便首先删除仍然存在的子节点,然后重新添加;将您的逻辑更改为删除那些真正删除(而不是添加回来)的项目,并仅插入那些真正新的项目

使用这两个步骤中的任何一个,您都应该让系统正常工作。

马克