2013-01-03 24 views
0

我有一個應用程序,大部分都有一個簡單的用戶表。 PK,UserID是Guid。我第一次使用EF代碼,並且一切都很好用下面的代碼:EF代碼優先和標識插入 - 一次性標識插入ON,其餘時間OFF

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid UserID { get; set; } 

然而,在我的應用程序的一個點,其實我是想逼的GUID。這是一個特例,除了這個代碼塊之外,其他地方都應該按照預期從數據庫中生成Guid。

我知道在我寫的初始化程序的Seed函數中,我可以插入很好的ID。我怎樣才能重現這些條件,以便我可以在這個邊緣情況下插入一個身份值?

+0

我會建議簡單地使用存儲過程爲這一個實例。 –

+0

我可以使用C#代碼而不是數據庫編寫存儲過程嗎?我想可能不是。 我假設傳遞給Seed()方法的數據上下文有一些屬性被操作,允許在這種情況下使用IDENTITY INSERT。在這種情況下,我不得不寫一些SQL代碼。 – Richthofen

回答

1

如果不是自動生成的身份插入,請使用Guid作爲主鍵,然後使用NewGuid()的默認值。那樣的話,如果你不提供數據庫生成的Guid值。

不需要SP。

編輯:

或不具有自動生成的ID,讓實體本身控制的初始值。如果你在施工後設置它的價值,那就沒問題。

通過對相關實體類的小改動,您可以實現您想要的功能。

class MyEntity { 
     public Guid EntityId { get; set; } 

     public MyEntity() { 
      EntityId = Guid.NewGuid(); 
     } 
    } 
+0

EF覆蓋數據庫的默認值,因此不起作用。 –

+0

我不知道代碼第一,只有數據庫第一,但我很難相信你不能控制列的默認值。無論採用哪種方式,您都可以對實體類進行小改動以獲得相同的結果。看我的編輯。 –

+0

這會工作。其缺陷在於任何更新Guid的代碼都是錯誤的。身份插入開/關排序爲我提供了心理保證,需要額外的步驟來更改該列。不是說流氓開發人員不能濫用身份插入... – Richthofen