1 约定配置
约定大于配置,框架默认了许多实体类配置的规则,在约定规则不满足要求时,可以显示地定义规则
1 数据库表明在不指定的情况下,默认使用的是数据库上下文类【DBContext】中DbSet 的属性名;
2 数据库表列的名字默认使用的是实体类属性的名字;列的数据类型采用与实体类属性类型相兼容的类型;
3 数据库列的可空性取决于对应实体属性的可空性;
4 实体类的属性为Id时,在数据库中对应的是主键,若属性类型为short、int、long类型时,则在数据库中默认是自增的
2 显示定义模型类配置规则
该文章使用的是MySQL的数据库,这里使用到了模型驱动开发的模式【现有实体类,后有数据库表。需要使用到迁移指令的使用,本篇文章的重点不是迁移指令的使用,所以忽略该内容】
2.1 Fluent API
使用框架定义的方法去配置模型类与数据库表的关系,通常在实现了IEntityTypeConfiguration《T》的Configure(EntityTypeBuilder builder)方法中去使用FluentAPI的方式去配置
public class Book{/// <summary>/// 书籍ID/// </summary>public long Id { get; set; }/// <summary>/// 标题/// </summary>public string? Title { get; set; }/// <summary>/// 发布时间/// </summary>public DateTime PublishTime { get; set; }/// <summary>/// 价格/// </summary>public double Price { get; set; }/// <summary>/// 作者名称/// </summary>public string ?AuthorName { get; set; }/// <summary>/// 描述/// </summary>public string Desc { get; set; }}
internal class BookConfiguration : IEntityTypeConfiguration<Book>{public void Configure(EntityTypeBuilder<Book> builder){//Book类对应数据库中的tb_book表builder.ToTable<Book>("t_books");//使用Fluent API的方式,显示地去配置类模型与数据库表的关系//HasColumnName指定数据库中列的名字builder.Property(e => e.Id).HasColumnName("id").IsRequired();//HasColumnType指定数据库中列的数据类型builder.Property(e => e.AuthorName).HasColumnType("varchar(100)").HasColumnName("author_name");//HasMaxLength 设定列的最大长度builder.Property(e => e.Title).HasColumnName("title").HasMaxLength(200);builder.Property(e => e.Price).HasColumnName("price");builder.Property(e => e.PublishTime).HasColumnName("publish_time");//实体类的属性默认全部会映射到数据库表中,可以使用Ignore去忽略制定的属性builder.Ignore(e=>e.Desc);}}
使用迁移指令后Update-database,将同步更新数据库中表信息。数据结构如下
2.2 Data Annotation
使用特性 【 A n n o t a t i o n 】 \textcolor{red}{【Annotation】} 【Annotation】的方式去配置模型类与数据库表的映射关系
//Table 指定表名称[Table("t_students")]internal class Student{public int Id { get; set; }//MaxLength 指定栏位长度 Required 指定列值必填[MaxLength(100)][Required]public string Name { get; set; }public int Age { get; set; }}
使用迁移指令后Update-database,将同步更新数据库中表信息。数据结构如下
2.3 如何选用自定义配置规则
Data Annotation 相较于使用FluentAPI的方式更为简洁,只需要使用特性标注即可,不需要单独的写配置类,不过FluentAPI更为强大,能够完全替代Data Annotation ,但是使用特性的方式则无法完全取代FluentAPI。微软官方默认推荐使用FluentAPI去配置模型类,不过两者是可以同时混用的,可以在Data Annotation无法实现的情况下使用FluentAPI去配置模型类。