002 如何建立数据表?如何查询数据库?
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. 举例
我们先来统计一下所需数据:
组织查询语句:
- 两个不同数据库之间的两个表如何关联起来查询数据
- 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注
- 如何优化数据库中数据的查询
- sqlserver 建立跨IP跨数据库查询配置数据链接
- 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注
- 在大型数据库数据查询时如何提高查询效率?
- sql中如何调用另一台服务器的数据库查询数据呢?
- 你知道如何查询/删除/建立DB2数据表的主键吗?
- 项目产品化升级数据库脚本问题——如何查询两个数据库差异的库表或者数据
- 如何快速建立数据字典,我如此设计小型数据库
- 如何建立一个与现存数据库相同,但不包含数据的空库?
- 如何设计高效合理的MySQL查询语句(建立数据库索引的基本原则)
- 如何将数据库中的多表的查询数据导出到excel中
- 如何用eclipse将数据库oracle数据相连接,实现查询数据库中的信息以及更改添加表中内容
- 如何在查询数据库时去除重复的数据
- sql中如何调用另一台服务器的数据库查询数据呢?
- Sqlserver 在查询分析器里如何访问远程的的数据库,进行数据查询更新等操作。
- 【云图】如何建立北京三甲医院云图,不用数据库持有自己数据!
- 如何将C#中将TextBox的数据以及从数据库中查询得到的数据导出到Excel中