Entity Framework Core系列教程-12-Fluent API 配置

Entity Framework Core Fluent API

Entity Framework Core Fluent API用于配置领域实体类以覆盖约定。 EF Fluent API基于Fluent API设计模式(也称为Fluent接口),其中结果通过方法链来表示。

在Entity Framework Core中,ModelBuilder类充当Fluent API。通过使用它,我们可以配置许多不同的东西,因为它提供了比数据注释属性更多的配置选项。
Entity Framework Core Fluent API配置了模型的以下方面:

  1. 模型配置:将EF模型配置为数据库映射。配置默认架构,数据库功能,其他数据注释属性和要从映射中排除的实体。
  2. 实体配置:配置实体到表和关系的映射,例如PrimaryKey,AlternateKey,Index,表名,一对一,一对多,多对多关系等。
  3. 属性配置:将属性配置为列映射,例如列名称,默认值,可空性,外键,数据类型,并发列等。
    下表列出了每种配置类型的重要方法:
配置 Fluent API方法 用法
模型配置 HasDbFunction() 在定位关系数据库时配置数据库功能
HasDefaultSchema() 指定数据库架构
HasAnnotation() 在实体上添加或更新数据注释属性
HasSequence() 定位关系数据库时配置数据库序列
实体配置 HasAlternateKey() 在EF模型中为实体配置备用密钥
HasIndex() 配置指定属性的索引
HasKey() 将属性或属性列表配置为主键
HasMany() 配置关系的“很多”部分,其中实体包含一对多或多对多关系的其他类型的引用集合属性
HasOne() 配置关系的“一部分”,其中实体包含一对一或一对多关系的其他类型的引用属性
Ignore() 配置不应将类或属性映射到表或列
OwnsOne() 配置关系,其中目标实体由该实体拥有。目标实体键值是从它所属的实体传播的
ToTable() 配置实体映射到的数据库表
属性配置 HasColumnName() 在数据库中为属性配置相应的列名称
HasColumnType() 为属性配置数据库中相应列的数据类型
HasComputedColumnSql() 配置属性以在关系数据库为目标时映射到数据库中的计算列
HasDefaultValue() 为目标关系数据库配置属性映射到的列的默认值
HasDefaultValueSql() 在定位关系数据库时,为属性映射到的列配置默认值表达式
HasField() 指定要与属性一起使用的后备字段
HasMaxLength() 配置可以存储在属性中的最大数据长度
IsConcurrencyToken() 将属性配置为用作乐观并发令牌
IsRequired() 配置属性的有效值是必需的还是null为有效值
IsRowVersion() 配置要在乐观并发检测中使用的属性
IsUnicode() 配置字符串属性,该属性可以包含或不包含Unicode字符
ValueGeneratedNever() 配置保存实体时不能具有生成值的属性
ValueGeneratedOnAdd() 配置在保存新实体时属性具有生成的值
ValueGeneratedOnAddOrUpdate() 配置保存新实体或现有实体时属性具有生成的值
ValueGeneratedOnUpdate() 配置在保存现有实体时属性具有生成的值

Fluent API 配置

重写OnModelCreating方法,并使用ModelBuilder类型的参数modelBuilder来配置领域实体类,如下所示:

public class SchoolDBContext: DbContext 
{
    public DbSet<Student> Students { get; set; }
        
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //Write Fluent API configurations here
        //Property Configurations
        modelBuilder.Entity<Student>()
                .Property(s => s.StudentId)
                .HasColumnName("Id")
                .HasDefaultValue(0)
                .IsRequired();
    }
}

在上面的示例中,ModelBuilder Fluent API实例用于通过调用链中的多个方法来配置属性。它配置Student实体的StudentId属性;它在单个语句而不是多个语句中使用HasColumnName配置名称,使用HasDefaultValue配置默认值,并使用IsRequired方法配置可空性。与多条语句相比,这提高了可读性,并且花费的时间更少,如下所示:

//Fluent API method chained calls
modelBuilder.Entity<Student>()
        .Property(s => s.StudentId)
        .HasColumnName("Id")
        .HasDefaultValue(0)
        .IsRequired();

//Separate method calls
modelBuilder.Entity<Student>().Property(s => s.StudentId).HasColumnName("Id");
modelBuilder.Entity<Student>().Property(s => s.StudentId).HasDefaultValue(0);
modelBuilder.Entity<Student>().Property(s => s.StudentId).IsRequired();

注意:Fluent API配置的优先级高于数据注释属性
接下来,学习如何使用Fluent API配置一对多关系。

posted @ 2020-02-07 22:04  星空天宇  阅读(251)  评论(0编辑  收藏  举报