在EF中,我們建立數據模型的時候,可以給屬性配置數據生成選項DatabaseGenerated,它后有三個枚舉值:Identity、None和Computed。
Identity:自增長
None:不處理
Computed:表示這一列是計算列。
在EF中,如果主鍵是int類型,Code First生成數據庫的時候會自動設置該列為自增長。但如果主鍵是Guid類型,我們就要手動的去設置了。
對於下面的模型,如果我們沒有設置自增長,數據庫中會以0來填充
public class Person { [Key] public Guid SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
var person = new Person { FirstName = "Rowan", LastName = "Miller", }; using (var context = new BreakAwayContext()) { context.People.Add(person); context.SaveChanges(); }
插入第二條記錄的時候就會報錯了。所以,下面的模型設置才是正確的。
public class Person { [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
現在我們來看看有些情況配置為None也是有用的。修改一下上面的模型。
public class Person { [Key] public int SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
我們再插入一條記錄看看
var person = new Person { FirstName = "Rowan", LastName = "Miller", SocialSecurityNumber = 12345678 }; using (var context = new BreakAwayContext()) { context.People.Add(person); context.SaveChanges(); }
在數據庫中存儲的是1,並不是我們所想要的12345678.這是為什么呢?
因為主鍵是SocialSecurityNumber是Int類型,Code First在數據庫中對該列作自增長處理。這時,我們想再插入自定義的SocialSecurityNumber就不行了。
所以當我們想這樣做時,就應該把SocialSecurityNumber的自增長配置為None.
public class Person { [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public int SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
如果對屬性標識為Computed,EF會認為該列是通過其它列計算得出的,不會將其持久化到數據庫中。
public class Person { [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public int SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public string Name { get; set; } }
var person = new Person { FirstName = "Rowan", LastName = "Miller", SocialSecurityNumber = 1231478, Name = "Rowan Miller", }; using (var context = new BreakAwayContext()) { context.People.Add(person); context.SaveChanges(); }
查看數據庫,我們看到Name並沒有存儲任何值。