我在实体框架中正确更新连接表时遇到问题。由于主键限制,我收到的错误无法更新。接近这个的正确方法是什么?
> 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();
}
答案 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错误但未向我们展示,则可能是您尝试以错误的顺序插入。需要在子表之前插入父表。