代码之家  ›  专栏  ›  技术社区  ›  Sisiutl

使用LINQ to SQL管理子列表

  •  1
  • Sisiutl  · 技术社区  · 17 年前

    违反主键约束 输入对象“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 回复  |  直到 17 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

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

    SubmitChanges() 打电话(您肯定也应该使用 提交更改() -不是 Save() !):

    * Inserts
    * Updates
    * Deletes
    

    (有关参考,请参见 here here )

    这里的问题是-您似乎要添加回子节点,这些子节点具有与您在中删除的节点相同的密钥 DeleteAllOnSubmit()

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

    • 要么删除子节点,然后调用 之前

    或:

    • 您可以更改逻辑,使仍然存在的子节点不会先删除,然后再重新添加;把你的逻辑改为 只有 删除那些真正被删除(而不是重新添加)的项目,只插入那些真正新的项目

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

    马克