上一篇文章简述了如何使用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,可查看微软官方文档
标签:配置,Name,builder,实体,EFCore,FluentAPI,Property,主键,属性 From: https://www.cnblogs.com/luohualiushui1173/p/17903818.html