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和其他贡献者.
| 归档时间: |
|
| 查看次数: |
60856 次 |
| 最近记录: |