EF Core 快速上手 --EF Core 入门
本节导航
三种数据库关系类型建模
Migration 方式创建和习修改数据库
定义和创建应用 DbContext
将复杂查询拆分为子查询
本章主要介绍如何使用 EF Core 进行数据库读取, 俗称查询. 您将创建一个数据库, 它包含 EFCore 中三种主要数据库关系类型. 在这个过程当中, 你将学会使用 EF Core 创建和改变数据库的结构.
接下来你将学习到如何使用 EF Core 访问数据库并从数据库表中获取数据. 在查看用主数据加载相关数据的各种方法之前, 你将了解 EF Core 查询的基本格式. 例如, 第一章中加载与书关联的作者.
在学习加载关联数据之后, 你将着手构建更加复杂的查询, 而这些是图书售卖网站运行起来所必须的. 这将涉及到排序, 过滤, 和分页, 以及将这些单独的查询命令组合在一起以创建一个复合数据库查询.
2.1 场景设定 -- 我们的图书销售网站
本章, 你将开始构建一个图书销售网站, 我们称之为 Book App. 这个应用示例提供了一个非常好的工具来查看查询中的关系. 本节介绍数据库, 各种类以及 Book App 访问数据库所需的 EF Core 部分.
note: 你可以在线访问 book App
http://efcoreinaction.com/
2.1.1 Book App 相关的数据库
尽管我们可以把一本书相关的信息, 它的作者, 评论都创建在一张表中, 但是在关系型数据库中那样做不会运行良好, 尤其是评论字段的长度是课变的. 关系型数据库范式会将重复数据拆分(比如, authors 表).
我们有几种方式可以把图书的数据各个部分在数据库中分类(存储), 但是对于本例, 数据库具有 EF-Core 关系中每种主要关系类型中的一种. 这三种类型是:
一对一关系: PriceOffer to a Book
一对多关系: Reviews to a Book
多对多关系: Books to Authors
一对一关系: PriceOffer to a Book
一本书会有一个促销价格. 这是通过在 PriceOffer * 实体类增加一个可选字段实现的, 这是一个一对一关心的例子(从技术上讲, 它是一对零或一关系, 但是 EF Core 对它们的处理时一样的). 请看图 2.1
为了计算这本你图书的最终价格, 你需要检查 PriceOffer 表的一行数据, 它们是通过外键关联的. 如果这行被查到有数据, NewPrice 字段的数据将被查到的价格替代, PromotionalText 的值将会在屏幕上显示, 比如:
$40 $30 Our summertime price special, for this week only!
一对多关系: Reviews TO A Book
你允许用户对图书予以评论. 他们可以给书评星级并能随意评论. 因为一本书可以有零个或多个 (不限制数量) 评论, 你需要创建一个表来存储上这些数据. 本示例中, 这张表可以命名为 Review.Books 表相对于 Review 表是一对多的关系. 如下图 2.2 所示:
你需要在摘要显示中, 您需要计算评论的数量并计算出平均星级, 以显示摘要. 例如, 这里有一个典型的屏幕显示, 你可能从这一对多的关系中产生, 如下:
Votes 4.5 by 2 customers
多对多关系: BOOKS TO AUTHORS
图书可以被一名或者多名写作, 一个作者可以些一本或多本图书. 因此, 需要一张 Books 表来存储书本数据, 另一张表 Authors 存储作者数据. Books 表和 Authors 表之间链接的表称为链接表.
此关系的典型屏幕显示如下
by Dino Esposito, Andrea Saltarello
2.1.2 本章未涉及的其他关系类型
在 EF Core 中, 你可以定义一个实体类, 而这个是实体类继承自另一个实体类. 例如, 你可以定义 PriceOffer 继承至 BooK. 那样会获得和此前一对一关系一样的结果. EFCore 通过每个层次结构一个表 (TPH) 的模式实现, 这个在第七章会涉及到.
另外 i 一种关系类型是分层关系: 一组数据项通过层次结构相互关联. 一个典型的实例是 Employee 类. 它有一个指向员工经理的关系, 而经理反过来又是员工(注: 这种关系可能叫自关联).
EF Core 使用与一对一和一对多相同的方法来提供层次关系. 在第七章, 我会更多谈论这个关系, 在那里, 我会解释如何配置.
2.1.3 最终的数据库展示所有表
图 2.4 展示了 Book App 的数据库, 这个数据库将用于本章和第三章的实例. 它包含所有已描述的表, 包括完整的 books 表中所有列的定义
NOTE:
这个数据库关系图使用了和第一章相同的布局和术语. PK 表示主键, FK 表示外键.
为了帮助你理解这个数据库, 图 2.5 展示了输出到屏幕的图书列表, 但是请将目光聚焦到一本书上.
2.1.4 EF Core 映射到数据库的类
我创建了 5 个能够映射到数据库中五个表的类. 它们是 Book,PriceOffer,Review , Author,BookAuthor 是多对多关系表.
这些类被称为实体类, 以表明它们被 EF Core 映射到了数据库. 从软件视角, 这些类没有什么特别之处. 它们是常规的. NET 类, 有时被称为简单传统 CLR 对象(Plain Old CLR Object / POCO). 实体类标志着这个类是 EF Core 映射到数据库的类.
主实体类是 Book 类, 如下展示. 你可以看到, 它关联了一个实体类 PriceOffer, 一个 Review 实体类的集合和 BookAuthor 实体类的集合. BooKAuthor 将 Book 类链接到一个或多个 Author.
为了简单起见, 我们使用 ef core 的契约配置方法对数据库建模. 我们使用 EF Core 按照惯例来命名实体类的主键和外键的属性. 此外,.net 的导航属性, 例如 ICollectionReviews, 定义了我们想要的关系类型. 例如, Reviews 属性的类型是 ICollection, 这个关系是一对多关系. 第 6 章和第 7 章描述了其它方式来定义 EF Core 的数据库模型.
参考
《Entity Framework Core In Action》
来源: https://www.cnblogs.com/lucky_hu/p/10424676.html