EF-CodeFirst-域模型配置
之前说到CodeFirst会使用默认约定从域模型创建数据库,同时也提供了方法重写这些约定;有两种方法可以实现
- 使用数据注解属性
- 使用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-域模型配置的更多相关文章
- EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...
- EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型
官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新 ...
- asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)
一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent ...
- asp.net core系列 23 EF模型配置(概述, 类型和属性的包含与排除)
一.模型配置概述 EF使用一组约定基于实体类的定义来构建模型. 可指定其他配置以补充或替代约定的内容.本系列介绍的配置可应用于面向任何数据存储的模型,以及面向任意关系数据库时可应用的配置. 数据库提供 ...
- EF CodeFirst系列(6)---配置1对1,1对多,多对多关系
这一节介绍EF CodeFirst模式中的1对0/1,1对多,多对多关系的配置,只有梳理清楚实体间的关系,才能进行愉快的开发,因此这节虽然很简单但是还是记录了一下. 1. 1对0/1关系配置 1. 通 ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst
一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...
- EF CodeFirst 创建数据库
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 话说EF支持三种模式:Code First M ...
- 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统
本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMap ...
随机推荐
- [转]Ubuntu 16.04安装有道词典
原文:https://www.cnblogs.com/scplee/archive/2016/05/13/5489024.html 以前用Ubuntu 14.04 的时候,直接下载有道词典官方deb安 ...
- 如何解决安装VMware后郑广电宽带客户端不能登录的问题?
如何解决安装VMware后郑广电宽带客户端不能登录的问题? 问题:安装VMware后,郑广电宽带客户端不能登录,提示:“不允许代理上网”. 解决:将VMware的虚拟网卡(VMnet1和VMnet8) ...
- Yii2中的composer
1.下載composer 2.composer 插件或組件 3.有三處修改 a.composer require 的插件在vender下 b.同時vender下的composer文件修改 c.comp ...
- 验证java引用的小例子
1. 声明一个变量person指向一个引用对象, 然后将这个person添加到集合list中, 然后将变量person指向null, 问:list中添加的person变成null了吗? import ...
- 5. RAMN备份与恢复
一. rman简介 RMAN(Recovery Manager)是一种用于备份(backup).还原(restore)和恢复(recover)数据库的 Oracle 工具.RMAN只能用于ORACLE ...
- 【中间件安全】Weblogic 安全加固规范
1. 适用情况 适用于使用Weblogic进行部署的Web网站. 2. 技能要求 熟悉Weblogic安装部署,熟悉Weblogic常见漏洞利用方式,并能针对站点使用Weblogic进行安全加固. 3 ...
- SpringBoot(十六)-- 使用外部容器运行springBoot项目
spring-boot项目需要部署在外部容器中的时候,spring-boot导出的war包无法再外部容器(tomcat)中运行或运行报错. 为了解决这个问题,需要移除springBoot自带的tomc ...
- PHP开启伪静态(AppServ服务器)
mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法 1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查 ...
- 部门sonarque代码扫描测试服务器docker化
部门内部的服务器太多了,打算将对应的测试环境docker化. 转成docker后,以后不管是升级调研还是定制化开发测试都方便,就是事情太多,一直没有抽出身来做,今天处理下并把过程记录下来跟大家分享下. ...
- modbus协议说明(转)
MODBUS-RTU通讯协议简介 什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...