2014-11-24 82 views
0

我处理这个问题:我想在我的表自动生成的身份是int类型SQL IDENTITY自动增量当0,但仍允许显式插入

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

并且只要Id在新创建的对象中为0(未指定),它将插入相同的0.任何帮助表示赞赏,除了提供重新考虑体系结构(如果尝试失败,我会在其他任何情况下执行此操作)。

而这一切都必须在SQL CE和SQL Server上工作。

+1

我不确定你想要解决什么确切的问题。你能否提供一个使用案例,说明为什么以及何时需要插入一个已定义的ID而不是一个自动增加的ID? – Tanner 2014-11-24 15:37:09

+0

你在什么版本的SQL Server?这听起来像使用“序列”可能比使用标识列更有意义。 – 2014-11-24 16:04:25

+0

'Id是0(未指定)'0是int的默认和完全有效的值,因此它被指定。尝试使'Id'可以为空。如果它是空的(而不是0),EF应该能够照顾它。 – PoweredByOrange 2014-11-24 16:07:01

回答

0

如果您告诉EF主键是数据库生成的,那么它不会将ID传递给insert sql。你需要通过身份证,所以去DatabaseGenerated.None

但是你希望它是一个IDENTITY,所以在迁移脚本中使它成为一个。你可以改变CREATETABLE声明,加入到identity: true列规范,或者您可以通过使用Sql()方法

现在你需要插入过程中修改实际的SQL运行运行SQL修改表。唯一的方法就是configure your model to use stored procedures然后修改为插入过程的Up迁移生成的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 
+0

感谢您提供详细的答案,我忘了提及的一件事 - 它需要在sql server和sql ce上工作,所以程序不是一个选项。 – 2014-11-25 09:36:03

+0

这是一些捕获,即Catch-22 ....如果你重写'SaveChanges',那么你可能可以替换你自己的SQL在那里,但我会考虑改变你存档和恢复的方式 – Colin 2014-11-25 10:48:33

相关问题