【问题标题】:Managing child lists with LINQ to SQL使用 LINQ to SQL 管理子列表
【发布时间】:2009-09-15 06:33:08
【问题描述】:

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


【解决方案1】:

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

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

* Inserts
* Updates
* Deletes

(参考请见herehere

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

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

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

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

或者:

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

通过这两个步骤中的任何一个,您应该可以让您的系统正常工作。

马克

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2010-09-08
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多