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

and*_*d_E 13 c# sql sql-server-2008 composite-primary-key

我们最近在数据库中添加了一个新的"级别" - 在整个数据库的表中的现有ID Identity字段之上/之前添加了一个键"Company_ID".

例如,如果表具有ID然后是字段,则它现在具有Company_ID,然后是ID,然后是字段.这个想法是,这允许ID为提供给功能的每个不同的Company_ID值自动递增(Company_ID 1可以具有ID 1,2,3等; Company_ID 2可以具有ID 1,2,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
    )
Run Code Online (Sandbox Code Playgroud)

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

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

但是,现在我们要将Company_ID设置为指定值,保留ID,并像以前一样填充字段.

    _db.Project.Add(newProject);
    _db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

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

当IDENTITY_INSERT设置为OFF时,无法在表"Project"中为identity列插入显式值

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

Bob*_*way 14

问题在于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
Run Code Online (Sandbox Code Playgroud)


and*_*d_E 11

睡觉后,我发现了这个,对于Visual Studio c#代码:[DatabaseGenerated(DatabaseGeneratedOption.Identity)].这个(在我看来),为我的每个ID字段定义,告诉Visual Studio该字段是一个标识,并在向数据库发送值时"不管它".当Company_ID首先发生并且具有值时,告诉Visual Studio在其他地方存在标识字段允许_db.Project.Add(newProject);然后_db.SaveChanges();根据需要运行.这部分答案是针对Visual Studio方面的.我理解SQL的要求,IDENTIY_INSERT感谢@ matt-thrower,@ steve-pettifer和其他贡献者.


小智 5

对我有用的是一个simple EDMX update。正如我之前将“身份”设置为“关”,然后将其更改为“自动”。但是没有更新Edmx。更新后,它工作正常。