扩大
缩小
  

Code First02---CodeFirst配置实体与数据库映射的两种方式

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方法用于设置数据表的主键。

 

 总结:这一节主要介绍了实体跟数据库表的对应映射。

 

posted @ 2015-07-23 17:31  风筝遇上风  阅读(757)  评论(0编辑  收藏  举报