您的位置:首页 > 产品设计 > UI/UE

EF的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

2016-09-28 16:28 393 查看
I.EF的默认映射

上节我们创建项目,通过定义实体类就可以自动生成数据库,并且EF帮我们自动设置了数据库的主键、外键以及表名和字段的类型等,这就是EF的默认映射。具体分为:

数据库映射:Code First 默认会在本地的SQL Expression数据库中建立一个和DbContext的子类的全名相同的数据库,全名指的是命名空间加上类名。当然前面我们在配置文件里指定了要连接的数据库;

表映射:Code First 默认会按照类型名复数建立数据表,比如说Destination类对应的表名就叫Destinations;

列映射:Code First 默认会按照类中的属性名建立column,它还有默认的数据类型映射习惯,int会映射为interger,string会映射为 nvarchar(max),decimal会映射为decimal(18,2);

主键映射:Code First 默认会在类的属性中需找名字为Id或类型名称+Id的int类型的属性作为主键,并且是自增字段。

摘自这里

默认的映射一般只是简单的映射,当然这些都是可以修改的,请往下看。

II.使用Data Annotations和Fluent API配置数据库的映射

Data Annotations翻译过来就是数据注解,是通过直接在实体类的属性上加注类似标签的东西达到对数据库的映射;

Fluent API翻译过来就是流利的API,Fluent API是在DbContext中定义数据库配置的一种方式。要使用Fluent API 就必须在你自定义的继承自DbContext的类中重载OnModelCreating这个方法。

注意:使用Data Annotations必须添加引用:using System.ComponentModel.DataAnnotations; 更具体的引用请参考本章结尾的源码。

实战:

1.Data Annotations:

设置Destination表的Name不为null:

    [Required]
    public string Name { get; set; }


很简单,直接在属性上加[Required]标注即可;

2.Fluent API:

用Fluent api必须重写OnModelCreating方法,我们在上下文类里重写下OnModelCreating方法并添加不为空的配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<CodeFirst.Model.Destination>().Property(d => d.Name).IsRequired();
}


两种方式都可以配置EF对数据库的映射,任选其一就可以了。我更喜欢Fluent API的方式,故放出的demo中Data Annotations也是有的,不过都被注释了。随着开发的深入,有些东西还是必须用Fluent API的方式才能配置出来的。

上面的方法意思就是:先找到需要配置的实体类,然后点Property就是点出属性,=>是lambda表达式的写法,找到Name属性,然后调用IsRequired方法设置不为null。初见这东西肯定不好理解。没事,写法很固定,多写写就熟悉了。

注意:我的类库都修改了默认命名空间,都加了个CodeFirst. 方便区分,其他类库中调用,我也是习惯用完整的命名空间.类库再.实体类来调用。

思考:使用Fluent API方式配置,每次都需要在OnModelCreating方法里写上一行配置,这样一个实体类如果有3个属性需要配置,10个实体类就需要配置30个,那么就得在OnModelCreating方法里写30行,很麻烦且不易维护。

解决办法:注意返回值可以看出modelBuilder的Entity<>泛型方法的返回值是EntityTypeConfiguration<>泛型类。我们可以定义一个继承自EntityTypeConfiguration<>泛型类的类来定义domain中每个类的数据库配置。

ok,我们在DataAccess类库下新建一个继承自EntityTypeConfiguration<>泛型类的DestinationMap类,在构造函数里写上配置:

部分摘自这里

现在看了可能会头大,仅做了解和方便后期查阅。后续讲一对一、一对多和多对多的关系时反复的手写Fluent API的时候就会很好理解了。

源码:点击下载
http://www.kwstu.com/ArticleView/guandebao_201382485812638
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐