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去配置模型类。