2014-02-25 70 views
5

使用EntityFramework代碼優先,我創建了一個簡單的Foo表。這裏是我的實體:DatabaseGeneratedOption.Identity不生成Id

public class Foo 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual string Id { get; set; } 

    public virtual string Name { get; set; } 
} 

但是每當我試圖插入新行,我得到一個Cannot insert the value NULL into column 'Id'。爲什麼當我添加DatabaseGenerated屬性時發生這種情況?刪除和重新創建我的表格沒有區別。

+0

創建的表是否顯示「Id」列標記爲「IDENTITY」?底層數據庫是什麼? MS SQL?甲骨文? –

+0

@DStanley'Id'列未標記爲身份。底層數據庫是MS SQL。 – Jonathan

+0

你使用什麼版本的EF? –

回答

7

恆等式string列類型與SQL Server的支持。 (你如何期望這樣的字符串看起來像?)爲了得到這個工作,你可以 - 例如 - 在SQL Server中添加一個計算列/用戶定義的函數,它從普通的int標識列中格式化字符串 - 如here所示。

+0

我跟隨asp.net的[IdentityUser](http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.entityframework.identityuser.id(v = vs.111).aspx ),它使用一個字符串作爲id。柱。任何想法如何在這種情況下產生的價值? – Jonathan

+0

@Jonathan:我不知道,但我可以想象它不是數據庫生成的,而是一個必須手動設置爲唯一值的字符串(如用戶名或轉換爲字符串的guid)。 – Slauma

5
  1. 您忘記了Key屬性。主鍵不需要使用virtual
  2. 正如Slauma提到的那樣,您不能使用Identity作爲字符串數據類型。

試試這個代碼:

public class Foo 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual string Name { get; set; } 
} 
+0

可悲的是,這沒有什麼區別。 – Jonathan

+1

ops!該字符串也不能用作標識。 –

+0

我有這個問題,並相信與否我通過將我的ID的屬性名稱從ID更改爲{className} ID而得到它的工作。儘管我使用了Guid類型。 –