我正在处理这个问题:我希望在我的表中有自动生成的标识,类型为int
但是,我希望能够明确地设置身份。现在真正的挑战是这些东西正在通过实体框架。我的数据库包含IDENTITY(1,1)
列,IDENTITY_INSERT
设置为ON
。
每当Id
在新创建的对象中为0(未指定)时,它就会插入非常相同的0.任何帮助都会受到赞赏,除了重新考虑架构的提议(如果这种尝试,我会在任何其他情况下这样做失败)。
所有这一切都必须在SQL CE和SQL Server上运行。
答案 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