返回首页
当前位置: 主页 > 网络编程 > .Net实例教程 >

EF Code First开发系列—Conventions教程

时间:2016-10-16 21:17来源:知行网www.zhixing123.cn 编辑:麦田守望者

我们已经了解了如何搭建EF Code First开发环境,并且使用简单示例演示了开发主要步骤,可以看到文章中并未做特别配置,即可生成数据库表及相互间的关系。这个过程是由一系列Conventions(默认约定)定义实现的,本文将详细介绍Code First Conventions。
 

  • 什么是Conventions
Conventions是指一系列的默认规则,这些规则定义了领域类与EF概念模型之间的自动映射关系,并最终自动生成数据库(如上篇文章内容)。Conventions定义于System.Data.Entity.ModelConfiguration.Conventions 命名空间中。
 
  • Type Discovery(类型发现)
在EF Code First开发过程中,我们一般会创建一个context类(继承于DbContext),其中包括了一系列的DbSet泛型属性,EF会将包括在DbSet属性中的类型以及这些类型的引用类型映射为数据库表。另外,若类型存在继承关系,并且基类已定义DbSet属性,那么此基类所有的继承类将自动被发现和映射处理。所以Type Discovery总共有以下几种情况:
  1. Context类中包括的并定义于DbSet属性的类型;
  2. 第1)种情况中类型的引用类型(可以定义于不同的程序集);
  3. 继承于第1)种情况中类型的所有子类型;
  4. Primary Key Convention(主键约定)
若类型中存在名称为Id或<Class Name>Id(大小写不敏感),该属性将默认设置为主键,主键的数据类型可以任意指定,如下:

若类型中未定义名称为Id或<Class Name>Id的属性,将会报ModelValidationException错误。
  • Relationship Convention(关系约定)
Code First使用导航属性来定义两个实体类型之间的关系。导航属性可以是简单引用类型,也可以是集合类型。如下Role类中定义了User类的导航属性CreatedBy:

生成的数据表如下:

默认情况下,关系约定会自动插入外键,格式为:<导航属性名称>_<导航属性类别的主键名>,如上图中的CreatedBy_Id。
 
  • Foreign key Convention(外键约定)
     
从上面我们了解到,Code First在识别导航属性时,会自动添加一个外键。但是推荐的做法是在关系依赖端加入一个外键属性,如下所示:

在Role类中加入了CreatedById属性,Code First会创建CreatedById列代替CreatedBy_Id列,如下所示:

 
  • Complex type Convention(复杂类型约定)
若类型没有主键属性,同时也没有使用DataAnnotation和Fluent API来定义主键,Code First将会为其创建复杂属性。例如,创建一个Address类型,其没有主键属性:

User类型引用了Address类型

Code First将Address类作为复杂类型来对待,自动生成的数据库表如下所示:

 
【结束语】

         本文主要介绍了EF Code First的Conventions,包括了Type Discovery、Primary Key Convention、Relationship Convention、Foreign key Convention和Complex type Convention等。依照这些预定义的约定,Code First会自动将领域类型及其关系转换为数据表及其主外键关系。但是很多情况下,这些默认约定并不能满足开发要求,一方面我们可以自定义Convention来实现,但是更多的是使用DataAnnotation或者Fluent API来重写。
顶一下
(0)
0%
踩一下
(0)
0%
标签(Tag):C#
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片