Dot-Net

如何使用 Entity Framework 6.1 正確標記標識列?

  • August 13, 2021

我看過很多關於如何將欄位標記為標識列的文章和答案。其中許多已經過時,並且針對的是舊版本的實體框架。

一些資源告訴我在欄位上使用屬性:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }

其他資源告訴我將此程式碼添加到OnModelCreating方法中:

modelBuilder.Entity<User>().Property(u => u.ID).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);

我應該使用哪一個?第一,第二,兩者,都無所謂,還是別的什麼?

只要主鍵屬性的類型是數字或 GUID,Code First 就會按照慣例自動將鍵配置為標識列。

這意味著您不需要在程式碼中進行任何配置來明確地將屬性設置為標識列,因為 Code First 已經為此使用了約定。您設置的數據註釋屬性或 fluent API 配置是無用的。

僅當您想禁用標識時,才在數字或 GUID 類型的主鍵上使用這些配置。

(對於搜尋並到達這裡的人)還有一點需要注意的是,EF Core 將嘗試在插入查詢的 ID 欄位中使用一個值,即使它被標記為 DatabaseGeneratedOption.Identity。我在我的 Id 欄位中有 -1 試圖添加一條新記錄並期望 EF 忽略我的值,但它將它傳遞給插入查詢並失敗並出現“無法為標識列插入顯式值”它僅在您設置時有效Id 欄位為零。

引用自:https://stackoverflow.com/questions/33946212