首页 文章

使用LINQ to SQL管理子列表

提问于
浏览
1

我有一个简单的父子情况,父母可以有多个孩子 . 用户可以通过从列表框中选择或取消选择子项列表来随意更新子项列表 . 我尝试使用下面的代码更新子列表但我得到一个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 回答

  • 4

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

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

    * Inserts
    * Updates
    * Deletes
    

    (供参考,见herehere

    这里的问题是 - 您似乎添加了与您在 DeleteAllOnSubmit() 调用中删除的密钥相同的子节点 .

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

    你需要做的是两件事之一:

    • 要么删除子节点,再调用 SubmitChanges() before 再次添加新项目

    要么:

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

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

相关问题