除了惯例原则与属性数据注解外,Fluent API是另一种支持数据类配置设置的方式。优先权:Fluent API> 数据注解 > 惯例。
在DbContent类定义OnModelCreating方法是最常用的调用Fluent API的地方。
public class SchoolContext: DbContext
{
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Write Fluent API configurations here
}
}
Fluent API 针对实体类与其属性成员提供了各种映射设置,具体见下表:
配置 | Fluent API 方法 | 作用 |
---|---|---|
架构相关配置 | HasDefaultSchema() | 数据库的默认架构 |
ComplexType() | 把一个类配置为复杂类型 | |
实体相关配置 | HasIndex() | 实体的的索引 |
HasKey() | 实体的主键(可其实现复合主键,[Key]在EF core中不能实现复合主键) | |
HasMany() | 1对多的或者 多对多关系 | |
HasOptional() | 一个可选的关系,这样配置会在数据库中生成一个可空的外键 | |
HasRequired() | 一个必有的关系,这样配置会在数据库中生成一个不能为空的外键 | |
Ignore() | 实体或者实体的属性不映射到数据库 | |
Map() | 设置一些优先的配置 | |
MapToStoredProcedures() | 实体的CUD操作使用存储过程 | |
ToTable() | 为实体设置表名 | |
属性相关配置 | HasColumnAnnotation() | 给属性设置注释 |
IsRequired() | 在调用SaveChanges()方法时,属性不能为空 | |
IsOptional() | 可选的,在数据库生成可空的列 | |
HasParameterName() | 配置用于该属性的存储过程的参数名 | |
HasDatabaseGeneratedOption() | 配置数据库中对应列的值怎样生成的,如计算,自增等 | |
HasColumnOrder() | 配置数据库中对应列的排列顺序 | |
HasColumnType() | 配置数据库中对应列的数据类型 | |
HasColumnName() | 配置数据库中对应列的列名 | |
IsConcurrencyToken() | 配置数据库中对应列用于乐观并发检测 |
示例:
//类型映射
//不将DbSet<Product>映射到Products数据表
modelBuilder.Ignore<Product>();
//将Product类映射到名称为tbProduct的数据表
modelBuilder.Entity<Product>().ToTable("tbProduct");
//将Product类映射到名称为tbProduct的数据表,并且指定Schema名称
modelBuilder.Entity<Product>().ToTable("tbProduct","kt");
//属性映射
//忽略某个属性的映射,与注解NotMapper一样
modelBuilder.Entity<Product>().Ignore(p=>p.SPrice);
//指定属性与字段的映射
modelBuilder.Entity<Product>().Property(p=>p.Price).HasColumnName("ProductPrice");
//字段长度
modelBuilder.Entity<Product>().Property(p=>p.Name).HasMaxLength(50);
//必填
modelBuilder.Entity<Product>().Property(p=>p.Name).IsRequired();
//指定字段类型
modelBuilder.Entity<Product>().Property(p=>p.Name).hasColumnType("varchar");
//指定字段是否支持Unicode
modelBuilder.Entity<Product>().Property(p=>p.Name).IsUnicode(false);
//设置主键
modelBuilder.Entity<Product>().HasKey(p=>p.PId);