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配置了模型的以下方面:
- 模型配置:将EF模型配置为数据库映射。配置默认架构,数据库功能,其他数据注释属性和要从映射中排除的实体。
- 实体配置:配置实体到表和关系的映射,例如PrimaryKey,AlternateKey,Index,表名,一对一,一对多,多对多关系等。
- 属性配置:将属性配置为列映射,例如列名称,默认值,可空性,外键,数据类型,并发列等。
下表列出了每种配置类型的重要方法:
配置 | 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配置一对多关系。