您的位置:首页 > 数据库

002 如何建立数据表?如何查询数据库?

2019-05-07 16:22 495 查看

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. 举例

 

我们先来统计一下所需数据:

组织查询语句:

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐