实体框架:具有复合键问题的表:违反PRIMARY KEY约束。无法在对象中插入重复键

时间:2018-01-17 06:18:24

标签: c# sql-server entity-framework

我正在使用带有edmx&的实体框架sql数据库。

我有3个表:1)产品2)语言3)ProductDesc

现在产品表的产品ID&语言表的LangID在ProductDesc中用作外键,“ProductID + LangID”是ProductDesc表的复合键,ProductDesc表有4个其他desc列和&都是nvarchar。

现在当我插入/更新产品数据时,我正在办理登机手续 如果ProductDesc与ProductID P1和LangID L1一起存在,则代码返回null,下一行代码尝试在ProductDesc中插入数据,但会出错 违反PRIMARY KEY约束'PK_ProductDesc'。无法在对象'dbo.ProductDesc'中插入重复键,而表ProductDesc中没有包含ProductID和LangID组合的记录。

var pDesc = db.ProductDescs.FirstOrDefault(x => x.ProductID == ProductID && x.LangID == LangID);
if (pDesc == null)
{
    pDesc = new ProductDesc();
    pDesc.ProductID = ProductID;
    pDesc.LangID = LangID;
    db.ProductDescs.Add(pDesc);
}
db.SaveChanges();

当我从UI为一个产品执行插入/更新数据时,这很正常。

但是当我对从windows服务中插入的批量数据使用相同的功能时,会导致此错误。 我的Windows服务从azure队列中读取数据并调用相同的函数来为每个产品插入数据。

从Windows服务中成功插入约100条记录然后发生此问题

1 个答案:

答案 0 :(得分:0)

当您要插入的数据中存在重复项时,您将收到与主键冲突相同的错误。

假设我有一个像这样的表

CREATE TABLE TableA
(
 Id INT PRIMARY KEY,
 Name VARCHAR(25)
)

我正在插入Id 1

的记录
INSERT INTO TableA
VALUES(1,'ABC')

它将被插入而不是上面的,如果我尝试从同一个语句中插入具有相同ID的2个记录,就像这样

INSERT INTO TableA
VALUES(1,'ABC'),(1,'XYZ')

它会给我主键违规错误,并且不会在表上显示任何现有记录。

因此请确保输入数据中没有重复项

相关问题