Entity Framework Fluent API用于配置域类以覆盖约定。EF Fluent API基于Fluent API设计模式(又名Fluent Interface),其结果由方法链组成。
在Entity Framework Core中,ModelBuilder类充当Fluent API。通过使用它,我们可以配置许多不同的东西,因为它提供了比数据注释属性更多的配置选项。
实体框架Core Fluent API配置模型的以下方面:
- 模型配置:将EF模型配置为数据库映射。配置默认架构,数据库功能,附加数据注释属性和要从映射中排除的实体。
- 实体配置:将实体配置为表和关系映射,例如PrimaryKey,AlternateKey,Index,表名,一对一,一对多,多对多关系等。
- 属性配置:将属性配置为列映射,例如列名,默认值,可为空性,Foreignkey,数据类型,并发列等。
下表列出了每种配置的重要方法。
配置 | Fluent API 方法 | 用途 |
---|---|---|
Model 配置 | HasDbFunction() | 在定位关系数据库时配置数据库功能。 |
HasDefaultSchema() | 指定数据库架构 | |
HasAnnotation() | 在实体上添加或更新数据注释属性 | |
HasSequence() | 在定位关系数据库时配置数据库序列. | |
Entity 配置 | HasAlternateKey() | 为实体配置EF模型中的备用密钥。 |
HasIndex() | 配置指定属性的索引 | |
HasKey() | 将属性或属性列表配置为主键. | |
HasMany() | 配置关系的许多部分,其中实体包含一对多或多对多关系的其他类型的引用集合属性. | |
HasOne() | 配置关系的一部分,其中实体包含一对一或一对多关系的其他类型的引用属性。. | |
Ignore() | 配置不应将类或属性映射到表或列. | |
OwnsOne() | 配置目标实体归该实体所有的关系。目标实体密钥值从其所属的实体传播。. | |
ToTable() | 配置实体映射到的数据库. | |
Property 配置 | 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实例用于通过调用链中的多个方法来配置属性。它配置实体的StudentId
属性Student
; 它使用单个语句中HasColumnName
的默认值using HasDefaultValue
和nullability 配置名称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配置一对多关系。