SQL IDENTITY在0时自动递增但仍允许显式插入

时间:2014-11-24 15:27:52

标签: sql-server entity-framework

我正在处理这个问题:我希望在我的表中有自动生成的标识,类型为int

但是,我希望能够明确地设置身份。现在真正的挑战是这些东西正在通过实体框架。我的数据库包含IDENTITY(1,1)列,IDENTITY_INSERT设置为ON

每当Id在新创建的对象中为0(未指定)时,它就会插入非常相同的0.任何帮助都会受到赞赏,除了重新考虑架构的提议(如果这种尝试,我会在任何其他情况下这样做失败)。

所有这一切都必须在SQL CE和SQL Server上运行。

1 个答案:

答案 0 :(得分:0)

如果告诉EF主键是数据库生成的,那么它不会将id传递给insert sql。您需要传递ID,因此请使用DatabaseGenerated.None

但是你希望它是一个IDENTITY,所以在迁移脚本中加一个。您可以更改CREATETABLE语句,将identity: true添加到列规范中,也可以通过使用Sql()方法运行sql来修改表

现在您需要在插入期间修改实际的sql运行。唯一的方法是configure your model to use stored procedures然后修改在向上迁移中为插入过程生成的sql:

CREATE PROCEDURE [dbo].[My_Insert]  
  @Id int,  
  --ETC  
AS  
BEGIN 
  IF(Id > 0) SET IDENTITY_INSERT ON

  INSERT --ETC

  IF(Id > 0) THEN BEGIN
     SET IDENTITY_INSERT OFF
     SELECT Id
  ELSE
     SELECT SCOPE_IDENTITY() AS Id 
  END

END