[翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
Entity Framework Core in Action
Entityframework Core in action是 Jon P smith
所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。因为没有中文版,所以本人对其进行翻译。 预计每两天一篇更新 PS: 翻译难免限于本人水平有不准确的地方,建议英文水平不错的同学直接查看原版,有不足的地方欢迎指正
第一部分目录导航
掀开EF Core的引擎盖看看EF Core内部是如何工作的
创建了MyFirstEfCoreApp应用程序后,你现在可以通过它查看EF Core的工作原理,重点不在于应用程序的代码,而是在读取和写入数据到数据库时EF Core内部会发生什么. 我的目标是让你了解EF Core的工作机制,当你深入研究本书其余部分的命令时,这会很有帮助
注 书中仅给出了关键代码, 完整示例在 https://github.com/JonPSmith/EfCoreInAction/tree/Chapter01
数据库建模
在对数据库进行操作之前,EF Core必须进行数据库建模. 数据库建模是EF Core通过实体类和其他EF Core配置来描述数据库的方法. EF Core在所有的数据库访问中使用建立的模型
建模在创建应用程序的DbContext时就开始了,在本例中是AppDbContext(如图1.5所示,在上一篇文章中). 它有属性DbSet,使得通过代码可以访问数据库
图1.6描述了建模过程的概述,它会帮助你理解EF Core数据库建模的过程. 后续的章节将介绍一系列配置数据库的相关命令,在本文中使用默认配置
图1.6展示了EF Core在AppDbContext的建模步骤,下文对此过程进行更详细的说明
- EF Core查看DbContext并找到所有公共的DbSet属性,并使用属性名为表定义初始名称.
- EF Core查看DbSet的泛型类,查看类的属性构建列名,类型等. 它还会查找类和属性用于提供额外建模配置的特殊Attribute
- EF Core查找DbSet类中引用的其他类. 在我们的例子中Book类有一个对Author类的引用,所以EF Core也会查看它. 它对Author类执行与步骤2相同的操作. 同时它使用类名Author做为表名
- 建模过程的最后一个步骤, EF Core运行DbContext的虚方法
OnModelCreating
, 可以通过重写OnModelCreating
方法使用fluent Api进行更多的建模配置,但本例中为了保持示例的简单并没有这样做 - EF Core根据收集的信息创建数据库的内部模型,并缓存数据库模式,以便提升访问速度. 在之后的所有的数据库访问中使用此模型
你可能会注意到图1.6并没有展示数据库,因为EF Core构建内部模型时,它不会去查看数据库. 我强调这一点是为了说明构建一个的数据库模型多么重要,如果EF Core认为数据库模型和实际的数据库不匹配,就会出现问题
在你的应用程序中你可以使用EF Core来创建数据库,这会避免出现不匹配的情况. 如果你想要一个良好且高效的数据库,那么在你的代码中编写良好的数据库模型是非常重要的,这样创建的数据库会是高效的. 创建,更新和管理数据库结构是一个很大的主题,将在11章详细介绍
从数据库中读取数据
现在可以访问数据库了. 我们使用List(l)命令,让程序读取数据库并在终端上打印信息. 图1.7显示了输出
下面列出代码清单, 用于将所有的图书与作者输出到控制台
EF Core使用Linq(语言集成查询)执行它想要执行的命令,使用.net类保存数据
代码清单中粗体显示的两行代码进行了数据库访问. 下面让我们看看EF Core如何使用Linq代码访问数据库并返回数据. 图1.8跟随着这些代码走进EF Core内部,看看不为人知的故事...
从数据库中读取数据的过程如下
- Linq查询中的
db.Books.AsNoTracking().Include(a => a.Author)
访问应用程序DbContext的DbSet属性,Include(a => a.Author)
显式加载关系的Author部分. 数据库提供程序将Linq翻译成访问数据库的SQL命令. SQL被缓存以便如果再次使用相同的查询语句时避免重新翻译的成本
EF Core在数据库访问方面会尽可能高效. 在这种情况下,它将需要读取的两张表(Books和Author)组合到一个大表中,在一次数据库访问中完成工作. 下面的清单展示了EF Core和数据库提供程序创建的SQL
SELECT [b].[BookId], [b].[AuthorId], [b].[Description], [b].[PublishedOn], [b].[Title], [a].[AuthorId], [a].[Name], [a].[WebUrl] FROM [Books] AS [b] INNER JOIN [Author] AS [a] ON [b].[AuthorId] = [a].[AuthorId] - 数据库提供程序读取数据后,EF Core通过以下过程放置数据: (a) 创建.NET类的实例 (b) 使用数据库关系链接(外键),通过引用(称为关系修复)将.NET类链接在一起. 结果是一组以正确方式链接的.NET类实例. 在本例中两本书有相同的作者Martin Fowler,因此这两本书的作者属性指向同一个Author类
- 由于代码中包含
AsNoTraching
, 所以EF Core知道禁止创建跟踪快照. 跟踪快照用于发现数据的变化, 你会在编辑WebUrl的示例中了解这一点. 由于这是一个只读查询,因此禁用跟踪快速会使查询更快
更新数据库
现在使用MyFirstEfCoreApp中的第二个命令update(u)来更新图书Quantum Networking作者的WebUrl列. 如图1.9所示,首先列出所有书籍,会看到最后一本书的作者没有WebUrl. 然后运行命令u,它将要求输入Url. 这时输入 httqs://entangled.moon
(这是一个虚构的Url,httpqs-.-),在更新成功后再次列出所有的书籍,这时可以看到Web Url值已经更新
代码清单
图1.10展示了EF Core内部发生了什么并跟踪其进度,这比上一个read的示例复杂许多, 因此我会给你一些提示
图顶部的读取阶段与上一个读取示例类似,所以应该很熟悉. 在此基础上使用图书的标题做为过滤器载特定的图书. 重要的是第2点: 对数据进行跟踪
在图的下半部分你可以看到EF Core如何将加载的数据与跟踪快照进行比较并找到更改,可以看到只有WebUrl被更新了,它创建了一个SQL命令来只更新该列
图中已经描述了大部分步骤,下面介绍Author的WebUrl列如何更新的详细说明
- 应用程序使用LINQ查找包含作者信息的单个图书,EF Core将LINQ查询翻译为SQL命令,读取Title为Quantum Networking的行,返回Book和Author类的实例,因为使用了
Single
查询,所以还会检查是否只找到一行 - LINQ查询中没有
AsNoTracking
方法,所以该查询是一个具有跟踪的查询,EF Core创建了数据的跟踪快照 - 然后代码更改了Book的Author的WebUrl属性. 当调用SaveChanges时, 检测更改阶段会将跟踪的所有类与跟踪快照进行比较. 在这里它会检测到所有已更改的内容. 在本例中主鍵为3的Author实例的WebUrl属性值被更改
- 检测到更改后,EF Core将启动事务. 每个数据库更新都以原子单位完成: 更改全部成功或者全部失败. 这非常重要,因为如果仅应用了部分更改,关系数据库可能会发生严重的错误
- 更新请求由数据库提供程序转换为SQL命令,如果执行成功则提交事务并返回SaveChanges方法,否则会抛出异常
[翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的的更多相关文章
- EF Core in Action 中文翻译 第一部分导航
Entityframework Core in action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core ...
- [翻译 EF Core in Action 2.3] 理解EF Core数据库查询
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 2.0] 查询数据库
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.11] 何时不应该使用EF Core
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.8] MyFirstEfCoreApp应用程序设置
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.7] MyFirstEfCoreApp访问的数据库
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
随机推荐
- 在Java中谈尾递归--尾递归和垃圾回收的比较(转载)
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- HTML学习笔记6:列表标签
列表标签 什么是列表标签呢? 以平台区分有什么游戏? 手游 pc游戏 家用机游戏 掌机游戏 以游戏类型区分有什么游戏? RPG ARPG MMORPG ACT FPS 以上两种就是一种列表标签 ...
- Github发现优秀的开源项目
先上个大logo,哈哈. github上有非常多的资源,我们可以在github上搜索到非常多的开源项目.那么如何使用github查找资源? 罗列出一下几种方式. 1.Explore 登录GitHub, ...
- sqlilabs 1-4
near '1' --+ ' LIMIT 0,1 ?id=999' union select 1,database(),5 --+ 当前数据库?id=999' union select 1,user( ...
- Tiny4412之按键驱动
一:按键驱动 按键驱动跟之前的LED,蜂鸣器的方法类似:通过底板,核心板我们可以看到按键的电路图: 通过电路图我们可以看出,当按键按下去为低电平,松开为高电平:所以我们要检测XEINT26的状态,通过 ...
- 关于Linux虚拟化技术KVM的科普 科普四(From humjb_1983)
另一组关于KVM的分析文档,虚拟化相关概念.KVM基本原理和架构一-概念和术语.KVM基本原理和架构二-基本原理.KVM基本原理及架构三-CPU虚拟化.KVM基本原理及架构四-内存虚拟化.KVM基本原 ...
- 【原】用Java编写第一个区块链(一)
写这篇随笔主要是尝试帮助自己了解如何学习区块链技术开发. [本文禁止任何形式的全文粘贴式转载,本文来自 zacky31 的随笔] 目标: 创建一个最基本的"区块链" 实现一个简单的 ...
- elasticsearch 的安装配置与spring boot的整合应用
linux上的elasticsearch安装 一.下载elasticsearch 直接进入elasticsearch的官网,下载最新的安装包:https://www.elastic.co/downlo ...
- Servlet到底是单例还是多例你了解吗?
为一个Java Web开发者,你一定了解和学习过Servlet.或许还曾在面试中被问到过Servelt是单例还是多例这个问题. 遇到这个问题,你是否曾深入了解过,还是百度或者Google了一下,得到答 ...
- web前端 DOM 详解
先来点概念 文档对象模型(DOM)是一个独立于语言的,使用 XML 和 HTML 文档操作的应用程序接口(API). 在浏览器中,主要与 HTML 文档打交道,在网页应用中检索 XML 文档也很常见. ...