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