之前说到CodeFirst会使用默认约定从域模型创建数据库,同时也提供了方法重写这些约定;有两种方法可以实现

  1. 使用数据注解属性
  2. 使用Fluent API

数据注解属性

数据注释是一种简单的基于属性的配置,可以将其应用于域类及其属性。这些属性不仅用于EF,还用于ASP.NET web表单或MVC等,包含在system.componentmodel.dataannotations和system.componentmodel.dataannotations.schema中

注意:数据注释仅为配置选项的子集,数据注释属性不支持实体框架的所有配置选项。Fluent API,它提供了EF的所有配置选项。

System.ComponentModel.DataAnnotations

Attribute Description
Key 可以应用于属性以指定实体中的键属性,并将相应的列作为数据库中的PrimaryKey列
Timestamp 可以应用于属性以指定数据库中相应列的数据类型rowversion
ConcurrencyCheck 可以应用于属性以指定相应的列应包含在乐观并发检查中
Required 可以应用于属性以指定相应的列是数据库中的NotNull列
MinLength 可以应用于属性以指定数据库中相应列允许的最小字符串长度
MaxLength 可以应用于属性以指定数据库中相应列允许的最大字符串长度
StringLength 以应用于属性以指定数据库中相应列允许的最大字符串长度

System.ComponentModel.DataAnnotations.Schema

Attribute Description
Table 可以应用于实体类以在数据库中配置相应的表名称和模式
Column 可以应用于属性来配置数据库中相应的列名,顺序和数据类型
Index 可以应用于属性以配置相应列应在数据库中具有索引。(仅限EF 6.1)
ForeignKey 可以应用于属性以将其标记为外键属性
NotMapped 可以应用于应该从模型中排除的属性或实体类,并且不应该在数据库中生成相应的列或表
DatabaseGenerated 可以应用于属性以配置基础数据库应该如何生成相应列的值,例如identity,computed或none
InverseProperty 可以应用于属性以指定代表同一关系另一端的导航属性的反转
ComplexType 在EF 6中将类标记为复杂类型。EF Core 2.0不支持此属性

之前看到数据库、表、字段是生成了,但是对应字段的约束,主外键、是否可为空是没有的。

现在给域模型加上数据注解属性再看一下


“Mobile”字段没有添加到表中,因为在域模型中使用数据注解[NotMapped]将该字段设置为不映射到数据库;其余字段的是否可空和长度已经被创建完毕。以小见大,其实核心就是EF通过域模型加相关配置的这种实现方式来构建数据库。

Fluent API

当EF从域类构建模型时,可以应用Fluent API配置。可以通过重写Entity Framework 6.x中的OnModelCreating方法来注入Fluent API配置DbContext;在EF6.x中,DbModelBuilder类充当Fluent API,我们可以使用它来配置许多不同的东西。它提供了比数据注解属性更多的配置选项,要编写Fluent API配置,需要覆盖上下文类中的OnModelCreating()方法DbContext

允许同时使用数据注解属性和Fluent API。Fluent API优先于数据注解属性

配置 API 描述
模型范围配置 HasDefaultSchema() 指定默认的数据库模式
  ComplexType() 将类配置为复杂类型
实体配置 HasIndex() 配置实体类型的索引属性
  HasKey() 配置实体类型的主键属性
  HasMany() 为一对多或多对多关系配置多关系
  HasOptional() 配置一个可选关系,它将在数据库中创建一个可为空的外键
  HasRequired() 配置将在数据库中创建不可为空的外键列的必需关系。
  Ignore() 配置该类或属性不应映射到表或列。
  Map() 允许与实体如何映射到数据库模式有关的高级配置。
  MapToStoredProcedures() 配置实体类型以使用INSERT,UPDATE和DELETE存储过程。
  ToTable() 配置实体的表名。
属性配置 HasColumnAnnotation() 在用于存储属性的数据库列的模型中设置注释。
  IsRequired() 配置SaveChanges()所需的属性。
  IsConcurrencyToken() 配置要用作乐观并发令牌的属性。
  IsOptional() 将该属性配置为可选,它将在数据库中创建一个可为空的列。
  HasParameterName() 配置该属性在存储过程中使用的参数的名称。
  HasDatabaseGeneratedOption() 配置数据库中相应列的值将如何生成,例如计算,身份或无。
  HasColumnOrder() 配置用于存储属性的数据库列的顺序。
  HasColumnType() 配置数据库中相应属性列的数据类型。
  HasColumnName() 配置数据库中属性的相应列名称。
  IsConcurrencyToken() 配置要用作乐观并发令牌的属性。

使用Fluent API配置域模型

数据注释仅为Fluent API的子集,他们都是用来针对域模型做相关操作;(项目中如果在OnModelCreating中写了大量Fluent API配置的域模型,那么会变得难以维护,EF中可以通过创建单独类为每个类都配置一个相关类来解决)

总结:CodeFirst模式提供了数据注解和Fluent API来配置域模型,域模型中可能会存在主外键关系,EF也支持配置一对一、一对多、多对多的设计。做过的项目中不是很喜欢用外键,这里把域模型中针对这块的讲解先放放,用到的时候再看。

相关资源
CoreFirst配置一对一
CoreFirst配置一对多
CoreFirst配置多对多

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

EF-CodeFirst-域模型配置的更多相关文章

  1. EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...

  2. EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型

    官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新 ...

  3. asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)

    一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent ...

  4. asp.net core系列 23 EF模型配置(概述, 类型和属性的包含与排除)

    一.模型配置概述 EF使用一组约定基于实体类的定义来构建模型. 可指定其他配置以补充或替代约定的内容.本系列介绍的配置可应用于面向任何数据存储的模型,以及面向任意关系数据库时可应用的配置. 数据库提供 ...

  5. EF CodeFirst系列(6)---配置1对1,1对多,多对多关系

    这一节介绍EF CodeFirst模式中的1对0/1,1对多,多对多关系的配置,只有梳理清楚实体间的关系,才能进行愉快的开发,因此这节虽然很简单但是还是记录了一下. 1. 1对0/1关系配置 1. 通 ...

  6. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  7. [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst

    一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...

  8. EF CodeFirst 创建数据库

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    话说EF支持三种模式:Code First   M ...

  9. 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统

    本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMap ...

随机推荐

  1. border绘制三角形

    (1)有边框的三角形 我们来写下带边框的三角形. 如果是一个正方形,我们写边时,会用到border,但我们这里讨论的三角形本身就是border,不可能再给border添加border属性,所以我们需要 ...

  2. Android Launcher分析和修改11——自定义分页指示器(paged_view_indicator)

    Android4.0的Launcher自带了一个简单的分页指示器,就是Hotseat上面那个线段,这个本质上是一个ImageView利用.9.png图片做,效果实在是不太美观,用测试人员的话,太丑了. ...

  3. 【iCore4 双核心板_ARM】例程二十:LWIP_TCP_CLIENT实验——以太网数据传输

    实验现象: 核心代码: int main(void) { system_clock.initialize(); //ϵͳʱÖÓ³õʼ»¯ led.initialize(); //LED³õʼ ...

  4. C语言 · 2n皇后问题

    基础练习 2n皇后问题   时间限制:1.0s   内存限制:512.0MB        锦囊1 搜索算法. 锦囊2 先搜索n皇后的解,在拼凑成2n皇后的解. 问题描述 给定一个n*n的棋盘,棋盘中 ...

  5. C++ 智能指针六

    /* 智能指针unique_ptr */ #include <iostream> #include <string> #include <memory> #incl ...

  6. 第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件

    第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件 设置后台列表页面字段统计 在当前APP里的adminx.py文件里的数据表管理器里设置 ag ...

  7. java+Quartz实现定时任务

    1.首先:导入quartz相关的jar包,这里我用的是maven构建的项目,pom.xml文件导入如下: <dependency> <groupId>org.quartz-sc ...

  8. Spark学习笔记——泰坦尼克生还预测

    package kaggle import org.apache.spark.SparkContext import org.apache.spark.SparkConf import org.apa ...

  9. 自己开发chrome插件生成二维码

    摘要: 最近在开发微信项目时,需要在微信调试,所以经常会在微信中输入本地服务地址,输入起来特别麻烦,所以自己就想了想微信中的扫一扫,然后开发了这款chrome插件,将当前url生成二维码,用微信扫一扫 ...

  10. [Tensorflow] Object Detection API - prepare your training data

    From: TensorFlow Object Detection API This chapter help you to train your own model to identify obje ...