系列文章

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

  你允许用户对图书予以评论。他们可以给书评星级并能随意评论。因为一本书可以有零个或多个(不限制数量)评论,你需要创建一个表来存储上这些数据。本示例中,这张表可以命名为ReviewBooks表相对于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 的导航属性,例如ICollection Reviews,定义了我们想要的关系类型。例如,Reviews属性的类型是ICollection,这个关系是一对多关系。第6章和第7章描述了其它方式来定义EF Core的数据库模型。

参考

  •   《Entity Framework Core In Action》

EF Core 快速上手——EF Core的三种主要关系类型的更多相关文章

  1. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  2. EF Core 快速上手——创建应用的DbContext

    系列文章 EF Core 快速上手--EF Core 入门 EF Core 快速上手--EF Core的三种主要关系类型 本节导航 定义应用的DbContext 创建DbContext的一个实例 创建 ...

  3. C++中的三种继承关系

    C++中的三种继承关系 先看类中声明成员时的三种访问权限 public : 可以被任意实体访问 protected : 只允许子类及本类的成员函数访问 private : 只允许本类的成员函数访问 在 ...

  4. PD的CDM模型中的三种实体关系

    PD的CDM模型中的三种实体关系 本文摘自:http://www.cnblogs.com/syf/articles/2480580.html PD 正向工程使用说明:http://download.c ...

  5. EF Core中避免贫血模型的三种行之有效的方法(翻译)

    Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...

  6. 【EF】EntityFramework 更新数据库字段的三种方法

    实体类 public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public Tes ...

  7. 一个简单的例子理解Kubernetes的三种IP地址类型

    很多Kubernetes的初学者对Kubernetes里面三种不同的IP地址和工作机制理解得不是很清楚. 本文我们通过一个最简单的例子来学习. 用如下命令行创建一个基于nginx的deployment ...

  8. .net core快速上手

    2014年11月12日的Connect ();开发者活动上宣布将.NET堆栈基于MIT协议开源,并且提供开源保证,托管在Github上.当时的版本与最终目标相距甚远,然而有一点可以肯定的是,这是一个与 ...

  9. Hibernate之jpa实体映射的三种继承关系

    在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class).Joined策略(table per subclass)和Table_PER_Class策略. 1.单表继承 ...

随机推荐

  1. matplotlib解决中文乱码

    调试以前写的matplotlib相关脚本,中文呈方块样:重新解决一遍,感觉比以前的理解更进一步,故而记下一笔: 1. 首先要为matplotlib添加中文字体库: 系统字体库在/usr/share/f ...

  2. python接口自动化(二十五)--unittest断言——下(详解)

    简介 本篇还是回归到我们最初始的话题,想必大家都忘记了,没关系看这里:传送门  没错最初的话题就是登录,由于博客园的登录机制改变了,本篇以我找到的开源免费的登录API为案例,结合 unittest 框 ...

  3. Xshell访问和连接Linux

    Xshell是一款强大的安全终端模拟软件,Xshell 模拟了远程主机的操作,其实质就是通过访问和连接到远程主机,在本地实现对远程主机的操作.  一.下载 官网:https://www.netsara ...

  4. CTF丨2019互联网安全城市巡回赛·西安站,我们来了!

    万物互联时代,网信事业发展突飞猛进,互联网悄然渗透到国民生活的每一个角落,伴随而来的网络安全威胁和风险也日渐突出.网络诈骗.钓鱼软件.勒索病毒等安全问题层出不穷,信息泄露等网络安全事件也频繁上演,给用 ...

  5. python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

    简介 大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.虽然或许通过代码实现了,也是稀里糊涂的一知 ...

  6. 使用ConcurrentHashMap一定线程安全?

    前言 老王为何半夜惨叫?几行代码为何导致服务器爆炸?说好的线程安全为何还是出问题?让我们一起收看今天的<走进IT> 正文 CurrentHashMap出现背景 说到ConcurrentHa ...

  7. COW奶牛!Copy On Write机制了解一下

    前言 只有光头才能变强 在读<Redis设计与实现>关于哈希表扩容的时候,发现这么一段话: 执行BGSAVE命令或者BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的 ...

  8. zookeeper源码 — 一、单机启动

    zookeeper一般使用命令工具启动,启动主要就是初始化所有组件,让server可以接收并处理来自client的请求.本文主要结构: main入口 配置解析 组件启动 main入口 我们一般使用命令 ...

  9. Fast R-CNN中的边框回归

    前面对R-CNN系的目标检测方法进行了个总结,其中对目标的定位使用了边框回归,当时对这部分内容不是很理解,这里单独学习下. R-CNN中最后的边框回归层,以候选区域(Region proposal)为 ...

  10. 搭建基于Docker社区版的Kubernetes本地集群

    Kubernetes的本地集群搭建是一件颇费苦心的活,网上有各种参考资源,由于版本和容器的不断发展,搭建的方式也是各不相同,这里基于Docker CE的18.09.0版本,在Mac OS.Win10下 ...