C# · 12月 28, 2021

c# – 当使用复合键将IDENTITY_INSERT设置为OFF时,无法在表中插入标识列的显式值

我们最近在我们的数据库中添加了一个新的“级别” – 在数据库中的表中的现有ID标识字段之前添加了一个关键字“Company_ID”.

例如,如果一个表具有ID然后字段,它现在有Company_ID,然后是ID,然后是这些字段.这个想法是,这允许ID为提供给功能的每个不同的Company_ID值自动递增(Company_ID 1可以具有ID 1,2,3等; Company_ID 2可以具有ID 1,3等).

自动增量字段保持为ID.示例表是:

[dbo].[Project]( [Company_ID] [int] NOT NULL,[ID] [int] IDENTITY(1,1) NOT NULL,[DescShort] [varchar](100) NULL,[TypeLookUp_ID] [int] NULL,[StatusLookUp_ID] [int] NULL,[IsActive] [bit] NOT NULL,CONSTRAINT [PK_Project] PRIMARY KEY CLUSTERED ( [Company_ID] ASC,[ID] ASC )

在引入Company_ID之前,要执行CREATE,我们只需填充DescShort,TypeLookUp_ID,StatusLookUp_ID和IsActive字段,并将左ID设置为默认值,可能为0.

记录保存成功,ID由数据库自动填充,然后用于通过View执行SHOW,等等.

然而,现在我们要将Company_ID设置为一个指定的值,留下ID,然后填充这些字段.

_db.Project.Add(newProject); _db.SaveChanges();

是的,我们要指定Company_ID值.我们希望自动填充ID,如前所述.
我们收到错误讯息:

Cannot insert explicit value for identity column in table “Project”
when IDENTITY_INSERT is set to OFF

是否由指定Company_ID或ID字段引起?你知道我们如何纠正这个问题?

解决方法 问题在于ID.如果将字段设置为IDENTITY,则通常不能为其指定值 – IDENTITY属性标记为允许数据库自动为列添加递增值.

要解决此问题,请从ID中删除自动IDENTITY属性(如果要自动增加它,则可以随时在处理代码中执行此操作 – 在该字段中获取最高值,然后添加一个,然后分配该值)或转到数据库,并在表上设置IDENTITY _INSERT,这暂时允许您将值分配给IDENTITY字段.

SET IDENTITY_INSERT [yourTableName] ON–go back and run your C# code>SET IDENTITY_INSERT [yourTableName] OFF