2014-11-24 77 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