我正在使用带有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条记录然后发生此问题
答案 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')
它会给我主键违规错误,并且不会在表上显示任何现有记录。
因此请确保输入数据中没有重复项