[翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景

Entity Framework Core in Action

Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另外一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。由于没有中文版,因此本人对其进行翻译。 预计每两天一篇更新 PS: 翻译不免限于本人水平有不许确的地方,建议英文水平不错的同窗直接查看原版,有不足的地方欢迎指正html

第一部分目录导航

假设场景 -- 图书销售网站

在本章中你会构建一个图书销售网站示例,称之为图书应用程序. 这个示例应用程序帮助咱们查看查询中的关系. 本节中介绍了图书应用程序所需的数据库与EF Core的实体类部分数据库

图书应用程序的关系型数据库

虽然咱们能够将做者,书,评论等全部数据都放到一张表中,但在关系型数据库中这样设计是很糟糕的,关系型数据库的规范是分离重复的数据,例如做者数据库设计

咱们有多种方式在数据库设计图书数据的各类部分,在本例中的数据库具备EF Core的主要关系类型,分别是如下三种:工具

  • 一对一的关系: 书与优惠价格
  • 一对多的关系: 书与评价
  • 多对多的关系: 书与做者

一对一的关系: 书与价格

一个书能够有促销价格,这经过PriceOffers表的一个可选行实现的,这是一个一对一的例子(从技术来说,这是一个1-0或1的关系,不过EF Core的处理方式是同样的);参见图2.1学习

The PriceOffers table has a foreign key that links to the books table's primary key网站

  • PriceOffers表有一个链接到books表主键的外键

EF Core uses its conventions to detect that this is a one-to-one relationship. It therefore adds a unique index to the foreign key to ensure that there can only be one per bookthis

  • EF Core使用它的约定来检测这是一个一对一的关系,所以它为外键添加了惟一索引,确保每本书只能有一个优惠价格

计算图书的最终价格,须要经过外键找到与图书连接的优惠价格记录. 若是找到了记录,NewPrice会取代原书的价格,并将PromotionalText显示到屏幕上; 例如:翻译

原价¥40现价¥9.9 温州印书场倒闭了,老板带着小姨子跑路了. 原价都是四十五十的,现价只要九块九设计

一对多的关系: 书的评论

顾客能够评价一本书;他们能够评星级,也能够留文字评论. 由于一本书可能没有一个评论或者有不少(无限)的评论,因此须要建立一张表保存这些数据. 在本例中它是Review表. Books表与Review表是一对多的关系, 如图2.2所示3d

The Review table is linked to the Books table via the foreign key called BookId

  • Review表经过BookId外键连接到Books表

在显示图书介绍时,须要计算评论数量与平均星级评价. 这些经过一对多的关系去检索. 呈如今页面上是如下效果:

  • 平均分 4.5 共有1000用户评论

多对多的关系: 图书与做者

一书本可能由一我的编写也可能由多人编写, 一我的(做者)能够著做一本书或多本书. 这是一个典型的多对多关系,在数据库中Books表保存图书数据,Authors表保存做者. Books和Authors表之间的连接就是多对多关系. 它们之间须要一张中间表. 参见图2.3

The BookAuthor table is the key to creating the many-to-many relationship and is known as a linking table

  • BookAuthor表是多对多关系的核心,称为中间表

This table uses the foreign keys as the primary keys. Because primary keys must be unique, this ensures that only one link can exist between a book and an author

  • BookAuthor表使用外键作为主键,由于主键必须是惟一的, 因此确保了书和做者之间只能有一个连接

多对多关系的页面展现以下

  • 删库到跑路 - 个人程序一辈子 赵日天,萧炎,林动 著

EF6: 在EF6中定义多对多关系不须要连接类,EF6会自动建立隐藏的中间表.可是在EF Core中必须本身建立中间表

本章中未涉及的其余关系类型

使用EF Core你可使用继承达到与以前一对一关系的相似结果,例如你能够将PriceOffer类继承自Book类. EF Core会使用第七章中介绍的table-per-hierarchy(TPH)实现. (子类和基类都须要包含在应用程序的DbContext中)

另外一种是分层关系类型: 一组经过层次关系彼此关系的数据项目. 一个典型的例子是员工与经理,经理也是员工的一种. EF Core使用与一对五和一对多相同的方法来提供层次关系,在第七章详细讨论这类关系与如何配置

最终数据库的样子

图2.4展现了图书应用程序的数据库,在本章和第三章的示例中咱们会使用到它. 图中包含了咱们以前提到每张表与列的定义

注: PK表示主键,FK表示外键

为了帮助理解,图2.5展现了图片列表的输出(只有一书本). 图书应用程序须要访问数据库中的每一张表来构建图书列表,后面我会使用代码进行查询显示

注: 你能够在http://efcoreinaction.com/查看在线的示例,会有助于你理解本章的剩余部分,你也能够在Github仓库中找到这个示例在本地调试运行

EF Core映射数据库的类

我建立5个类对应着灵气库中的5张表,分别是Book,PriceOffer,Review,Author和BookAuthor(多对多中间表)

这些类称之为实休类,以突出它们是由EF Core映射到数据库的. 从软件工程的角度来看实体类是普通的.Net类(有时也被称为POCO)并无什么特别之处. 由于它们是EF Core映射到数据库中的类,因此对其与其余类区分,称为实体类

图书应用程序中主要的实体类是Book类,以下图所示. 它引用了PriceOffer类,Review类型的集合以及BookAuthor的集合

咱们使用了EF Core的约定配置实体类的主键,也就是类中int类型的Id属性. 数据库在添加新行时使用 Sql Identity 命令建立惟一键

为了保持示例的简单,示例中使用了EF Core的约定配置方法对数据库建模. .Net类的导航属性(好比ICollection )定义了我须要关系类型,例如Reviews属性的类型是ICollection,因此是一对多关系. 第六章和第七章介绍了建模的其余方法

本文的示例介绍了如何经过EF Core定义和建立数据库,若是你已经有了一个现有数据库,可使用EF Core的逆行工程数据库的功能根据数据库表构建DbContext类和实体类,在11.3节中会介绍到,若是你不但愿EF Core更改数据库结果而是经过SQL脚本或数据库部署工具本身来管理,能够在11.4节中找到方法

相关文章
相关标签/搜索