1. 常见的几种数据表映射关系
一对一:一本书对应一个价格。
一对多:一本书对应很多条评论。
多对多:一本书可以由很多作者,一个作者也可以对应很多本书。
在价格表中,每个价格记录都有个书籍id对应,说明这条记录是针对这本书的。这是典型的一对一。
一本书可以被评论很多次(被多人评论),在Review表中设置外键指向Book的主键,这是典型的一对多的关系。
一本书可以有多个作者,一个作者可以写多本书,这是一个典型的多对多的关系。
2. 整体的数据表关系
3. 需求分析
我们要展示这样一个效果图,你会发现,这个效果图需要来自每个数据表的数据。
4. POCO类的设计
在Book类中,我们看到,不只是他自己的那些属性,在下方添加了一些导航属性。
Promotion提供的是一对一关系的PriceOffer属性
Reviews提供的是一对多关系的ICollection<Review>属性
AuthorLin提供的是多对多关系的ICollection<BookAuthor>属性
5. DbContext类的设计
6.试着操作数据
7.数据库迁移
需要使用一个工具:
Microsoft.EntityFrameworkCore.Tools
a 使用Add-Migration name来添加迁移
b 使用Update-Database更新数据库 ,没有数据库会自动创建数据库,有数据库会帮你应用迁移。
8.数据查询
前面的linQ语句执行并不会直接到数据库中进行操作数据,而仅仅是转换成了sql语句,什么时候开始执行呢?
a 遇到foreach迭代循环的时候
b 执行ToArray() ToDictionary() ToList() ToListAsync()等等集合操作的时候。
c 使用First或者Any等特殊操作的时候。
d 使用Load操作显示操作数据的时候
9. 显式加载
默认情况下,EF Core是不会主动加载导航属性的,因为这是优化读取速度的需要。
显式加载一般需要通过Include或者ThenInclude方法进行显式加载导航属性。
实际上,EFCore帮你进行了两次查询操作:
我们来看一个复杂点的显式加载:
使用Include进行一级加载,使用ThenInclude进行二级加载
10. 延时加载
延时加载是先加载主要的数据,额外的数据加载往后推迟到需要的地方,这样可能会导致数据查询操作的往返次数的增加,导致效率的降低。
先做查询,查询到指定的book,再加载额外的数据。
可以针对加载的数据进行额外的操作:
11. 选择加载
在select方法中访问导航属性即可加载额外的数据。
实际上,EF又把这些语句转换成了sql查询操作:
12. 举例
我们先来统计一下所需数据:
组织查询语句: