前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EF 约定介绍

EF 约定介绍

作者头像
郑小超.
发布2018-01-26 16:28:23
1.5K0
发布2018-01-26 16:28:23
举报
文章被收录于专栏:GreenLeavesGreenLeaves

当前环境为EF Code First开发模式中

一、EF默认约定

1、常用约定

(1)、当没有显示指定实体主键的时候,EF会默认将长得最像Id的属性(且类型为GUID)设为主键

(2)、设计实体时,当一个实体包含一个集合属性,该集合属性里面的元素是另一个实体时,则默认未一对多关系,即使没有显示的指定一对多的关系,EF会默认的设置主外键(主从)关系

(3)、一对一的实体关系,需要手动设置主从关系

(4)、多对多无载荷关系实体,EF自动生成中间表,不需要新增实体来表示.

(5)、表名默认复数化

2、类型发现约定(Type Discovery)

使用EF开发,往往是以定义一些模型类开始,定义完这些模型类之后,需要让DbContext知道哪些类型包含在当前模型中,因此,我们需要自定义一个ZdyNameDbContext,并继承DbContext,并在自定义DbContext中暴露需要暴露的类型,这样在Code First开发模式中,就可以使用

context(数据库上下文),使用这些预先暴露的DbSet类型,具体的代码如下:

代码语言:javascript
复制
  public class EFStudyDbContext:DbContext
    {
        //暴露City的DbSet类型的属性
        public DbSet<City> Citys { get; set; }

        //暴露Town的DbSet类型的属性
        public DbSet<Town> Towns { get; set; }
        public EFStudyDbContext():base("name=EFStudyConnstrings") {}

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }

3、主键约定(Primary Key Convention)

当没有显示指定实体主键的时候,EF会默认将长得最像Id的属性(且类型为GUID)设为主键,如果类中的属性(Property)名称为 ID (不区分大小写)或 ClassNameID(类名 + ID),Code First 则推断这个属性为主键。如果主键属性的类型为数字型或 GUID 则会被当成标识列(Identity Column

4、关系(外键/导航属性)约定Relationship(Foreign Key/Navigation Properties) Convention

EF中,两个实体间的关系是通过导航属性的方式来实现,每一个对象都能拥有一个它所参与的关系的导航属性,导航属性提供了一种方式在两端来操作这个关系来获取我们需要的数据,可以返回任何一方的引用对象(对象间的关系是1:0或1:1),或者对象的集合(对象间的关系是1:*或*:*),Code First 能够根据导航属性定义的方式来推断实体间的关系.并映射到数据库表中.

除了导航属性规定实体间的关系外,外键属性来式规定实体间方式的一种手段.Code First能够推断以下的命名属性为外键(优先级从上到下):

(1)、导航属性名+关联实体的主键名

(2)、关联实体实体名+关联实体的主键名

(3)、关联实体的主键名

注:

(1)、当外键关系被检测到,Code First会根据外键的可空性来推断关系的具体形式;如果外键属性是可空的,那么关系会被设置为可选的,否则,关系就是必选的.

(2)、当关联实体的外键属性被设置为不为空,Code First会设置级联删除,反之不会。

5、复杂类型约定(Complex Types Conventions)

如果Code First无法从类型中推测出主键,也没有通过Data Annotations或者Fluent Api进行注册的主键,那么此类型将会被注册成为复杂类型Complex Type,Complex Types要求类型中不能包含有对其他类型的引用,并且其它类型中也不能包含对本类型的引用的集合.代码如下:

代码语言:javascript
复制
    public class Order
    {
        public Guid Id { get; set; }
        public Details Details { get; set; }
    }

    public class Details
    {
        public System.DateTime Time { get; set; }
        public string Location { get; set; }
        public string Num { get; set; }
    }

6、连接字符串约定(Connection String Conventions)

EF 数据库连接约定(Connection String Conventions in Code First)

二、移除约定

EF提供了移除默认约定的方法,通过该方法我们可以移除所有定义在System.Data.Entity.ModelConfiguration.Conventions namespace下的约定,例如,移出表名复数约定,代码如下:

代码语言:javascript
复制
public class SchoolEntities : DbContext 
{ 
     . . . 
 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        // Configure Code First to ignore PluralizingTableName convention 
        // If you keep this convention, the generated tables  
        // will have pluralized names. 
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
}

三、自定义约定

EF 自定义约定

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档