2012-05-03 35 views
33

我知道這不是最理想的解決辦法,但我需要一個自動遞增字段添加到我的EF代碼優先目標之一。此列ID不是該ID,這是一個GUID。實體框架自動遞增場,這是不是ID

反正對我來說,在代碼中定義的自動遞增的字段,或將創建自己的列,並在DB界定它的自動遞增的工作?

回答

51

您可以標註該屬性與DatabaseGenerated(DatabaseGeneratedOption.Identity)。 EF僅允許每個表單一個標識列。

public class Foo 
{ 
    [Key] 
    public Guid Id { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Bar { get; set; } 
} 
+1

我見過的DatabaseGeneratedOption.Identity但TBH我一直偷懶,說好的讀到它,我只是認爲它使該列的PKEY領域。 謝謝,我會放棄它。 – JamesStuddart

+0

這是否仍然適用於Multitenant數據庫? – amd

+0

@Ahmad如果每個房客都有自己的種子,它將無法工作 – Eranga

6

老後期以爲我會分享我發現與實體框架6.1.3。

我創建使用C#和.NET Framework 4.6.1一個簡單的數據層庫,增加了一個簡單的存儲庫/服務類,代碼第一上下文類,並指出我的web.config文件到本地的SQL Express 2014數據庫。

在實體類添加以下屬性構造的id列:

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

然後創建通過鍵入新移民在Visual Studio 2015年包管理器執行以下操作:

添加遷移

給遷移的名稱,然後等待要創建的DbMigtation類。編輯類並添加以下CREATETABLE操作:

CreateTable(
"dbo.Article", 
    c => new 
    { 
     Id = c.Guid(nullable: false, identity: true), 
     Title = c.String(), 
     Content = c.String(), 
     PublishedDate = c.DateTime(nullable: false), 
     Author = c.String(), 
     CreateDate = c.DateTime(nullable: false), 
    }) 
    .PrimaryKey(t => t.Id); 
} 

上表是一個例子這裏的關鍵點是以下製造商註釋:

nullable: false, identity: true 

這告訴EF到specifiy列不nullabe並且您想將其設置爲由EF進行播種的標識列。

用下面的命令再次運行遷移:

update-database 

這將運行遷移類第一刪除表(向下()方法),然後在創建表(向上()方法)。

運行你的單元測試和/或連接到數據庫並運行一個select查詢,你應該看到你的表在新窗體中,添加一些數據,不包括Id列,你應該看到新的Guid(或者你選擇的任何數據類型)被生成。