Entity Framework Core-Fluent API

EF Core API 用来构建基于实体类的模型,我们可以使用Fluent API重写EF Core 默认契约,Fluent API 比默认契约和Data Annotations优先级更高
EF Core Fluent API提供了下面特性
模型配置:配置EF 模型到数据库的映射
实体配置:配置主键,备用键,索引,表名,一对一,一对多,多对多关系等
属性配置:配置属性到列的映射,例如:列名,默认值,可空、外键、数据类型等.

1 EF Core Fluent API例子

假如我们有一个Country的实体类

public class Country{    public int PId { get; set; }    public string Name { get; set; }    public DateTime AddedOn { get; set; }}
我们在DbContext类OnModelCreating()方法内完成EF Core Fluent API的配置
public class CountryContext : DbContext{    public CompanyContext(DbContextOptions<CompanyContext> options) : base(options)    {    }    public DbSet<Country> Country { get; set; }    protected override void OnModelCreating(ModelBuilder modelBuilder)    {        //Write Fluent API configurations here        //Entity Configuration        modelBuilder.Entity<Country>().HasKey(s => s.PId);        //Property Configurations        modelBuilder.Entity<Country>(entity =>        {            entity.Property(e => e.Name)                  .HasColumnName("CountryName")                  .HasDefaultValue("USA")                  .IsRequired();
            entity.Property(e => e.AddedOn)                  .HasColumnType("date")                  .HasDefaultValueSql("(getdate())");        });        modelBuilder.Entity<Country>().Ignore(e => e.population);     }}
在上面代码我们配置Country实体类:

Line 11: 使用HasKey()函数设置PId属性作为主键

Line 15-18:配置Name属性在数据库表中对应的列是CountryName,并且该列使用了一个USA默认值,IsRequired() 方法确保该列不为空

Line 21, 22 :AddedOn 属性默认设置为日期类型,并且使用了getdate()函数获取默认值

Line 24 :  使用Ignore() 方法指定Population属性不会在数据库表中创建列

注意:你可以在OnModelCreating 方法内将另外一些实体的配置,使用EF Core Migrations命令生成对应的表

2 Fluent API 方法

下面表中我们列举出了EF Core大多数常用的 Fluent API

类型

Fluent API方法

用途

模型配置

HasDbFunction()

配置数据库序列

模型配置

HasSequence()

配置数据库序列

模型配置

HasDefaultSchema()

指定数据库schema

实体配置

HasIndex()

配置属性作为索引

实体配置

ToTable()

配置实体对应的数据库中表的名称

实体配置 HasKey() 设置属性作为表主键
实体配置 HasNoKey() 表明实体没有主键,此类实体从不会跟踪,此实体也不会在数据库中做增删改查

实体配置

HasOne()

是一对一或者一对多关系的一部分
实体配置 HasMany() 配置一对多关系

实体配置

WithOne()

是一对一或者一对多关系的一部分

实体配置 WithMany() 用来配置一对多关系

实体配置

HasForeignKey()

配置属性作为外键

实体配置 Ignore() 指定属性将不会映射到数据库表中

实体配置

HasConstraintName()

指定外键约束名称

属性配置 HasColumnName() 指定属性对应数据库列名称
属性配置 HasColumnType() 指定属性对应数据库列类型
属性配置 HasDefaultValue() 针对属性在数据库中指定一个默认值
属性配置 HasDefaultValueSql() 针对属性在数据库中指定一个默认数据库列的表达式,例如 getdate()
属性配置 HasMaxLength() 指定属性对应数据库列最大长度
属性配置 IsUnicode() 指定列包含Unicode字符
属性配置 ValueGeneratedOnAdd() 保存一个新的实体配置为该属性生成一个默认值

3 Has/With 模式配置关联

使用Fluent API配置表关系时,我们经常会使用Has/With,Has & With 方法一块使用来配置表关系 

Has有两个方法
1 HasOne
2 HasMany
类似的With也有两个方法
1 WithOne
2 WithMany
HasOne和WithOne 方法创建一个引用导航属性,类似的,HasMany和WithMany方法用来创建一个集合导航属性