EF-CodeFirst-域模型配置

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

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

数据注解属性

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

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

System.ComponentModel.DataAnnotations
AttributeDescription
Key可以应用于属性以指定实体中的键属性,并将相应的列作为数据库中的PrimaryKey列
Timestamp可以应用于属性以指定数据库中相应列的数据类型rowversion
ConcurrencyCheck可以应用于属性以指定相应的列应包含在乐观并发检查中
Required可以应用于属性以指定相应的列是数据库中的NotNull列
MinLength可以应用于属性以指定数据库中相应列允许的最小字符串长度
MaxLength可以应用于属性以指定数据库中相应列允许的最大字符串长度
StringLength以应用于属性以指定数据库中相应列允许的最大字符串长度
System.ComponentModel.DataAnnotations.Schema
AttributeDescription
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;">

 
 
 
 

转载于:https://www.cnblogs.com/GnailGnepGnaw/p/9167496.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值