4.3.1 约定大于配置
主要的约定规则:
规则 1: 数据库表名采用上下文类中对应的 DbSet 的属性名。
规则 2:数据库表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型
兼容的类型。比如在 SQLServer 中,string 类型对应 nvarchar,long 类型对应 bigint。
规则3:数据库表列的可空性取决于对应实体类属性的可空性。EFCore6中支持C#中的
可空引用类型。
规则 4: 名字为Id 的属性为主键,如果主键为short、int 或者 long 类型,则主键默认采
用自动增长类型的列。
4.3.2 Data Annatation 数据注释
数据注释:用.NET提供的Attribute对实体类、属性;等进行标注的方式来实现实体类的配置
例如表名的配置、是否可空、数据长度等的配置
4.3.3 Fluent API
Fluent API也是用来配置实体类的,和Data Annatation的大部分功能都是重叠的,切Data Annatation看起来更简单。但官方更推荐Fluent API的方式。原因有俩:
1. Fluent API能更好的进行职责分离
2. Fluent API的功能更强大,Fluent API的功能面几乎覆盖了Data Annatation且拥有更多特有的功能。
这两者可以一同使用,Fluent API的优先级高于Data Annatation。
所以常用的配置方式有两种:
1. 混合:优先使用Data Annatation,Data Annatation使用更简单。Data Annatation无法实现时再用Fluent API。
2. 单一方案:只使用Fluent API
4.3.4 Fluent API 基本配置
1. 视图与实体类映射
modeBuilder.Entity<Blog>().ToView("blogsView");
2. 排除属性映射
modeBuilder.Entity<Blog>().Ignore(b=>b.Name2);
3. 数据库表列名
modeBuilder.Entity<Blog>().Property(b=>b.BlogId).HasColumnName("blogs_id");
4. 列数据类型
builder.Property(e=>e.Title).HasColumnType("varchar(200)");
5. 主键
6. 索引
把URL属性定义为索引
modeBuilder.Entity<Blog>().HasIndex(b=>b.Url);
7. 重载的方法
......还有很多其他配置属性
4.3.5 Fluent API 究竟流畅在哪里
书中讲了很多,核心一句话就是:Fluent API在进行实体类配置的时候可以进行链式编程,比如设置下面三个属性可以这样写:
也可以这样写:
也就是说,只要是设置返回类型的里的属性或者调用返回类型里方法,都可以一直“点点点”实现链式编程。
4.3.6 主键类型的选择并不简单