Linq to sql 使用LINQ to SQL管理子列表

Linq to sql 使用LINQ to SQL管理子列表,linq-to-sql,Linq To Sql,我有一个简单的亲子关系,父母可以有多个孩子。用户可以通过从列表框中选择或取消选择子项来随意更新子项列表。我尝试使用下面的代码更新子列表,但得到一个SqlException: 违反主键约束 “PK_Child_1”。无法插入重复项 输入对象“dbo.Child” LINQ似乎在删除现有子级之前插入新子级。我相信有一个简单的模式来处理这个问题,但我被难住了 context.DeleteAllOnSubmit(parent.Children); foreach (string childname in

我有一个简单的亲子关系,父母可以有多个孩子。用户可以通过从列表框中选择或取消选择子项来随意更新子项列表。我尝试使用下面的代码更新子列表,但得到一个SqlException:

违反主键约束 “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()
!):

(参考请参见和)

这里的问题是-您似乎添加了与在
deleteAllonsSubmit()
调用中删除的节点具有相同键的子节点

但是,由于新项目的插入在删除之前,因此最终会产生冲突

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

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

  • 您可以更改逻辑,使仍然存在的子节点不会先删除,然后再重新添加;将逻辑更改为仅删除那些真正被删除(而不是重新添加)的项目,并仅插入那些真正新的项目
使用这两个步骤中的任何一个,您都应该让系统正常工作


Marc

问题在于,您在删除旧项目之前添加了新项目

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

(参考请参见和)

这里的问题是-您似乎添加了与在
deleteAllonsSubmit()
调用中删除的节点具有相同键的子节点

但是,由于新项目的插入在删除之前,因此最终会产生冲突

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

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

  • 您可以更改逻辑,使仍然存在的子节点不会先删除,然后再重新添加;将逻辑更改为仅删除那些真正被删除(而不是重新添加)的项目,并仅插入那些真正新的项目
使用这两个步骤中的任何一个,您都应该让系统正常工作


Marc

它是实体框架,对吗?它是实体框架,对吗?
* Inserts
* Updates
* Deletes