站点图标 江湖人士

Entity Framework Core如何使用Fluent API

EF Core获取上下文SQL语句

EF Core获取上下文SQL语句

Entity Framework Fluent API用于配置域类以覆盖约定。EF Fluent API基于Fluent API设计模式(又名Fluent Interface),其结果由方法链组成

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

实体框架Core Fluent API配置模型的以下方面:

  1. 模型配置:将EF模型配置为数据库映射。配置默认架构,数据库功能,附加数据注释属性和要从映射中排除的实体。
  2. 实体配置:将实体配置为表和关系映射,例如PrimaryKey,AlternateKey,Index,表名,一对一,一对多,多对多关系等。
  3. 属性配置:将属性配置为列映射,例如列名,默认值,可为空性,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();
    }
}

在上面的示例中,ModelBuilderFluent 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配置一对多关系。

退出移动版