【问题标题】:Unable to Update Join/Lookup Primary Key Contraint [closed]无法更新加入/查找主键约束 [关闭]
【发布时间】:2015-03-26 22:39:21
【问题描述】:

我在实体框架中正确更新连接表时遇到问题。由于主键约束,我收到无法更新的错误。解决这个问题的正确方法是什么?

> Violation of PRIMARY KEY constraint 'PK_WEB_AUDIO'. Cannot insert
> duplicate key in object 'dbo.WEB_AUDIO'. The duplicate key value is
> (5110).

这是 CRON 作业的一部分,因此 AddOrUpdate 是必要的。

using (var ctx = new WebEntities())
{
    relatedFiles.ForEach(relatedFile =>
    {
    var assocProd = ctx.WEB_VAULT_LOOKUP.SingleOrDefault(c => c.MODEL_SERIES == product.PartId);

    assocProd.WEB_AUDIO.Add(new WEB_AUDIO()
        {
            AudioID = relatedFile.ID,
            DisplayName = relatedFile.Name,
            URL = relatedFile.Path
        });
    });
    ctx.SaveChanges();
}

【问题讨论】:

  • 什么时候调用 ctx.SaveChanges()?
  • 在 foreach 循环结束之后。 (更新的问题。)
  • 你能发布你得到的关键约束异常消息吗?
  • 请不要破坏您的帖子。你不能删除它,因为回答的用户会失去他们的声誉,浪费他们的时间。如果您真的想要删除您的帖子,您可以举起自定义标志要求删除,或使用页面底部的“联系我们”链接说明您的情况。

标签: c# sql .net entity-framework join


【解决方案1】:

您必须确保您没有复制相关的文件 ID。

if(assocProd.WEB_AUDIO.Any(wa => wa.AudioId == relatedFile.Id)) {
   return;
}

这很粗略,如果数据集不是很大,最好的方法是对现有 Id 进行连接并在内存中比较它们。

干杯。

【讨论】:

    【解决方案2】:

    显示的错误与FK无关,是PK错误。

    这是一个数据问题,您正在尝试插入表中已存在的数据。这就是PK应该做的,防止重复。这个错误是一件好事,它可以防止你造成混乱。这就是为什么我们有 PK 和 FK 之类的东西 - 以防止数据完整性问题。

    您可以分析您的插入以查看它是否尝试多次插入相同的数据。 (有时人们有一个意外循环)或者您可能会更改插入查询以确保记录不存在。或者,您可能会遇到两个用户尝试插入相同信息的竞争条件,或者用户在尝试插入信息之前没有正确查找信息。所有这些问题都会有不同的解决方案,您需要确切地知道为什么它会多次发送相同的记录。

    如果您有未向我们展示的 FK 错误,则可能是您尝试以错误的顺序插入。父表需要插入到子表之前。

    【讨论】:

    • 你是对的,它是一个主键。我正在寻找构建正确查询的方法,以确保记录不存在。
    猜你喜欢
    • 2019-11-11
    • 2020-03-28
    • 2011-11-20
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多