Code First有兩種配置數據庫映射的方式,一種是使用數據屬性DataAnnotation,另一種是Fluent API.
這兩種方式分別是什么呢?下面進行一一解釋:
DataAnnotation的配置方式需要你給定義實體和值對象的類和類中的屬性加上與數據庫映射相關的配置標簽。
比如說:我有一個實體類:Customers 按照Code First的規則,數據庫的表名應該是跟這個一致Customers,但是如果我想表名為Customer,那怎么才能讓實體識別到這個表名呢。
[Table(“CustomerInfo”)]
public class Customer·
{
???? …….
}
另外一種配置的方式是使用Fluent API,Code First Fluent API 是在DbContext中定義數據庫配置的一種方式。要使用Fluent API 就必須在你自定義的繼承自DbContext的類中重載OnModelCreating這個方法。這個方法的簽名如下:
?
protected override void OnModelCreating(DbModelBuilder modelBuilder)
通過modelBuilder這個對象的Entity<>泛型方法來配置DbContext中的每個類的數據庫映射。
我們可以通過Fluent API 配置數據表的名字:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
?? modelBuilder.Entity<Customer>().ToTable(“CustomerInfo”)
}
?其實在業務中我們都用Fluent API的方式去配置,這樣才能提現出Code First的原則,即是代碼和數據存儲分離開來的理念。
好吧。說了這么多理論,下面介紹一個例子來介紹一下怎么使用Fluent API來實現。
?
那我們假設一個需求,假設我們的訂單管理系統處理的都是個人客戶,假設每個個人客戶都是domain中的實體,假設實體的標識符是每個人的身份證號。假設我們的客戶都是中國人,那么身份證號應該是18位。客戶的名字應該不會太長,中國人的名字一般不會超過十個字吧?性別用M和F標識,我們還記錄客戶的地址和聯系電話。我們假設客戶的聯系電話記錄中國境內客戶的手機號,現在的手機號一般都是13位。我們的實體類如下:
?
大家應該清楚按照Code First的規則,數據表的主鍵必須是int,并且名稱必須是Id或者類名+Id。我們Customer表默認的主鍵應該是public int CustomerId{get;set;}。string類型默認會映射為nvarchar(max)
我們應該怎么寫這個映射關系?
?
modelBuilder的Entity<T>方法的返回值都為EntityTypeConfiguration<T>
IsRequired():通過這個方法指定該列是not-null的。
HasMaxLength():設定nvarchar列的最大字符數。
HasPercision(percison,scale):設定decimal列的最大值和小數點后位數。
HasColumnType(“TypeName”):設定列的類型,但是指定的列的類型必須與類中的屬性的類型相兼容。這個兼容規則后面將詳細介紹。
HasDatabaseGeneratedOption(DatabaseGeneratedOption):指定列是否是自增長列。
DatabaseGeneratedOption有三個選項:Idnetity:自增長
None:非自增長
Computed:用于一些通過計算得到值的列。
modelBuilder的Entity<Customer>方法的返回值還有一個HasKey方法用于設置數據表的主鍵。
?
?總結:這一節主要介紹了實體跟數據庫表的對應映射。
?