CodeFirst通過分析我們在代碼里編寫的類,以及類之間的關系生成數據庫表,以及表之間的各種關系。數據庫的表會涉及到主鍵,外鍵,列是否為空,列類型等等。 我們要通過怎樣的方式來暴露這些信息呢?
CodeFirst通過DataAnnotations(在 System.ComponentModel.DataAnnotations 命名空間中 )特性類標示這些信息。
常用的一些標識如下
主鍵
如果不存在符合EF默認規則的主鍵時,用key標注也可。個人不贊成這樣,遵守默認規則就好,免去不必要麻煩。
public class Category { [ Key ] public string TrackingKey { get; set; } public string CategoryName { get; set; } public string BlogID { get; set; } }
自增長
如果主鍵是int類型,EF為默認設置為增長。但如果是GUID類型,則要手動的設置自增長
public class User { [Key ,DatabaseGenerated (DatabaseGeneratedOption .Identity)] public Guid UserGuid { get; set; } public string UserName { get; set; } }
查看數據表的創建腳本,我們會發現多了這樣的一句話
ALTER
TABLE
[dbo]
.
[Users]
ADD
DEFAULT
(
newsequentialid
())
FOR
[UserGuid]
必需 MaxLength 和 MinLength
public class Category { [ Key ] public string TrackingKey { get; set; } [ Required ][MaxLength (30), MinLength(5)] public string CategoryName { get; set; } public string BlogID { get; set; } public string Description { get; set; } }
NotMapped
Code First 約定指示具有受支持數據類型的每個屬性都要在數據庫中有表示。但在您的應用程序中並不總是如此。例如,您可以在 Blog 類中使用一個屬性來基於 Title 和 BloggerName 字段創建代碼。該屬性可以動態創建,無需存儲。您可以使用 NotMapped 注釋來標記不映射到數據庫的所有屬性。
並且這個標示還可以用於對整個類進行標示,那這個類也就不會被映射了。
ComplexType
BlogDetails 作為 Blog 類中的一個屬性,將作為 Blog 對象的一部分被跟蹤。為了讓 Code First 認識到這一點,必須將 BlogDetails 類標記為 ComplexType。
public class Blog { public string ID { get; set; } public string BlogName { get; set; } public string BlogAuthor { get; set; } public virtual List < Post> Posts { get ; set ; } //導航屬性 public BlogDetails Detail { get; set; } } [ ComplexType] public class BlogDetails { public string BlogDescription { get; set; } public string CreateTime { get; set; } }
但是運行的時候卻報錯,提示Detail屬性,不可以為空 。原來,雖然復雜類型的每個屬性都可以為空,但當作為復雜屬性出現時,卻是不可以為空的,必須初始化!
需要修改如下

修改之后運行如下

會發現 復雜類型將自己的屬性並入了所屬類型,並以復雜類型名+屬性名作為新列名
數據注釋就到這里。喜歡歡迎推薦!