C# 为什么实体框架允许我在循环的第一次迭代时插入到具有标识主键的表中,但之后失败了?
我使用以下代码将记录插入到表中:C# 为什么实体框架允许我在循环的第一次迭代时插入到具有标识主键的表中,但之后失败了?,c#,entity-framework,C#,Entity Framework,我使用以下代码将记录插入到表中: foreach (string tag in splitTags) { objTag.Tag = tag; objTag.ReportId = objReport.ReportId; objTag.TagId = 0; context.Tags.Add(objTag); context.SaveChanges()
foreach (string tag in splitTags)
{
objTag.Tag = tag;
objTag.ReportId = objReport.ReportId;
objTag.TagId = 0;
context.Tags.Add(objTag);
context.SaveChanges();
}
该表有一个主键TagID
,它是一个标识列
它在循环的第一次迭代中按预期工作,但在出现错误的任何其他尝试中失败:
当identity\u insert设置为OFF时,无法在表“Tags”中为identity列插入显式值
我想知道为什么在进行任何上下文添加或保存更改之前,TagID设置为0时会发生这种情况,ReportID
每次都是相同的,唯一的区别是标记文本
谢谢循环中没有对象创建 一次又一次地插入同一对象 实际上,您更改了现有对象的主键,这是不允许的 因此,在每个循环中创建一个新对象
一般来说,在这样一个循环之后保存更改是首选的。循环中没有对象创建 一次又一次地插入同一对象 实际上,您更改了现有对象的主键,这是不允许的 因此,在每个循环中创建一个新对象
一般来说,在这样一个循环之后保存更改是首选的。除了@Holger的答案之外,您还可以像这样删除
foreach
:
var tags=splitTags.Select(s=>newtag{Tag=s,ReportId=ReportId});
context.Tags.AddRange(标记);
SaveChanges();
除了@Holger的答案之外,您还可以像这样去掉foreach的
var tags=splitTags.Select(s=>newtag{Tag=s,ReportId=ReportId});
context.Tags.AddRange(标记);
SaveChanges();
太棒了,工作得很好,谢谢。我会尽快接受你的答案!太棒了,工作得很好,谢谢。我会尽快接受你的答案!