EFCore 实体的配置FluentAPI(3)

发布时间 2023-12-15 18:03:06作者: 落花流水1173

上一篇文章简述了如何使用EFCore 的CodeFirst进行数据库创建并实现简单的增删改查,这章我们讨论一些复杂的配置:实体配置

实体配置目的:生成想要的表格类型,如表名,表的列名,表字段类型,长度等,下图是上一章EFCore生成的表

 

实体配置遵循约定大于配置的原则:就是说EFCore这个ORM框架已经给我们约定好了,主要有如下规则:

1)表名采用DBContext中的对用的DbSet的属性名
2)数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型
3)列的可空性取决于对应实体类属性的可空性,如string类型可空,double类型不可空
4)名字为Id的属性为主键,如果主键为short,int或者long类型,则默认采用自增字段,如果主键为Guid类型,则采用默认的Guid生成机制生成主键值

 

 

但有时我们需要不同的自定义配置,那就需要使用其它方式,EFCore提供两种方式进行实体配置

1、FluentAPI:把配置写到独立的配置类中(即继承于IEntityTypeConfiguration<T>的类)builder.ToTable("T_Books"),或者写到DbContext的OnModerCreating方法中(不推荐)

     缺点:复杂;优点:解耦

2、Data Annotation(不推荐使用):把配置以特性(Annotation)的形式标注在实体类中

       优点:简单;缺点:耦合

这章主要讲解FluentAPI

FlunentApI的一些功能:


//设置自定义表名
builder.ToTable("T_Students");
//配置数据库列名
builder.Property(x => x.Name).HasColumnName("Student_Name");
//配置主键
builder.HasKey(x=>x.Id);
//配置组合主键
builder.HasKey(x=>new {x.Id,x.Name });
//配置属性为必须项
builder.Property(x=>x.Name).IsRequired();
//配置忽略属性
builder.Ignore("Num");
//配置数据库列的数据类型
builder.Property(x => x.Name).HasColumnType("varchar");
//配置属性的最大长度
builder.Property(x => x.Name).HasMaxLength(30);
//配置属性的默认值
builder.Property(x => x.Age).HasDefaultValue(20);

 

 public class StudentConfig : IEntityTypeConfiguration<Student>
 {
     public void Configure(EntityTypeBuilder<Student> builder)
     {
         //设置自定义表名
         builder.ToTable("T_Students");
         //配置数据库列名
         builder.Property(x => x.Name).HasColumnName("Student_Name");
         //配置主键
         builder.HasKey(x=>x.Id);
         //配置组合主键
         builder.HasKey(x=>new {x.Id,x.Name });
         //配置属性为必须项
         builder.Property(x=>x.Name).IsRequired();
         //配置忽略属性
         builder.Ignore("Num");
         //配置数据库列的数据类型
         builder.Property(x => x.Name).HasColumnType("varchar");
         //配置属性的最大长度
         builder.Property(x => x.Name).HasMaxLength(30);
         //配置属性的默认值
         builder.Property(x => x.Age).HasDefaultValue(20);
        

     }
 }

执行迁移后生成的数据库表格如下:

 

建议每个实体都写一个对应的配置类进行配置,而不是在DBContext中的OnModelCreating方法中配置

关于更多FluentAPI,可查看微软官方文档