无法更新加入/查找主键约束

时间:2015-03-26 22:39:21

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

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

> 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();
}

Database

Model

2 个答案:

答案 0 :(得分:1)

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

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

粗略的,最好的方法是在现有ID上进行连接,并在数据集不是很大的情况下在内存中进行比较。

干杯。

答案 1 :(得分:1)

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

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

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

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