Entityframework Core in action是 Jon P smith
所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另外一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。由于没有中文版,因此本人对其进行翻译。 预计每两天一篇更新 PS: 翻译不免限于本人水平有不许确的地方,建议英文水平不错的同窗直接查看原版,有不足的地方欢迎指正html
建立了MyFirstEfCoreApp应用程序后,你如今能够经过它查看EF Core的工做原理,重点不在于应用程序的代码,而是在读取和写入数据到数据库时EF Core内部会发生什么. 个人目标是让你了解EF Core的工做机制,当你深刻研究本书其他部分的命令时,这会颇有帮助git
在对数据库进行操做以前,EF Core必须进行数据库建模. 数据库建模是EF Core经过实体类和其余EF Core配置来描述数据库的方法. EF Core在全部的数据库访问中使用创建的模型github
建模在建立应用程序的DbContext时就开始了,在本例中是AppDbContext(如图1.5所示,在上一篇文章中). 它有属性DbSet<Book>,使得经过代码能够访问数据库数据库
图1.6描述了建模过程的概述,它会帮助你理解EF Core数据库建模的过程. 后续的章节将介绍一系列配置数据库的相关命令,在本文中使用默认配置缓存
<img src="https://img2018.cnblogs.com/blog/832799/201902/832799-20190226095156685-307163266.png" referrerpolicy="no-referrer">学习
图1.6展现了EF Core在AppDbContext的建模步骤,下文对此过程进行更详细的说明spa
OnModelCreating
, 能够经过重写OnModelCreating
方法使用fluent Api进行更多的建模配置,但本例中为了保持示例的简单并无这样作你可能会注意到图1.6并无展现数据库,由于EF Core构建内部模型时,它不会去查看数据库. 我强调这一点是为了说明构建一个的数据库模型多么重要,若是EF Core认为数据库模型和实际的数据库不匹配,就会出现问题.net
在你的应用程序中你可使用EF Core来建立数据库,这会避免出现不匹配的状况. 若是你想要一个良好且高效的数据库,那么在你的代码中编写良好的数据库模型是很是重要的,这样建立的数据库会是高效的. 建立,更新和管理数据库结构是一个很大的主题,将在11章详细介绍翻译
如今能够访问数据库了. 咱们使用List(l)命令,让程序读取数据库并在终端上打印信息. 图1.7显示了输出code
<img src="https://img2018.cnblogs.com/blog/832799/201902/832799-20190226102244267-1093071067.png" referrerpolicy="no-referrer">
下面列出代码清单, 用于将全部的图书与做者输出到控制台
<img src="https://img2018.cnblogs.com/blog/832799/201902/832799-20190226103238572-1355908645.png" referrerpolicy="no-referrer">
EF Core使用Linq(语言集成查询)执行它想要执行的命令,使用.net类保存数据
代码清单中粗体显示的两行代码进行了数据库访问. 下面让咱们看看EF Core如何使用Linq代码访问数据库并返回数据. 图1.8跟随着这些代码走进EF Core内部,看看鲜为人知的故事...
<img src="https://img2018.cnblogs.com/blog/832799/201902/832799-20190226140616861-1403351889.png" referrerpolicy="no-referrer">
从数据库中读取数据的过程以下
db.Books.AsNoTracking().Include(a => a.Author)
访问应用程序DbContext的DbSet<Book>属性,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]AsNoTraching
, 因此EF Core知道禁止建立跟踪快照. 跟踪快照用于发现数据的变化, 你会在编辑WebUrl的示例中了解这一点. 因为这是一个只读查询,所以禁用跟踪快速会使查询更快如今使用MyFirstEfCoreApp中的第二个命令update(u)来更新图书Quantum Networking做者的WebUrl列. 如图1.9所示,首先列出全部书籍,会看到最后一本书的做者没有WebUrl. 而后运行命令u,它将要求输入Url. 这时输入 httqs://entangled.moon
(这是一个虚构的Url,httpqs-.-),在更新成功后再次列出全部的书籍,这时能够看到Web Url值已经更新
<img src="https://img2018.cnblogs.com/blog/832799/201902/832799-20190226132527234-735969280.png" referrerpolicy="no-referrer">
代码清单
<img src="https://img2018.cnblogs.com/blog/832799/201902/832799-20190226133234442-1057103695.png" referrerpolicy="no-referrer">
图1.10展现了EF Core内部发生了什么并跟踪其进度,这比上一个read的示例复杂许多, 所以我会给你一些提示
图顶部的读取阶段与上一个读取示例相似,因此应该很熟悉. 在此基础上使用图书的标题作为过滤器载特定的图书. 重要的是第2点: 对数据进行跟踪
在图的下半部分你能够看到EF Core如何将加载的数据与跟踪快照进行比较并找到更改,能够看到只有WebUrl被更新了,它建立了一个SQL命令来只更新该列
<img src="https://img2018.cnblogs.com/blog/832799/201902/832799-20190226135002482-593136351.png" referrerpolicy="no-referrer">
图中已经描述了大部分步骤,下面介绍Author的WebUrl列如何更新的详细说明
Single
查询,因此还会检查是否只找到一行AsNoTracking
方法,因此该查询是一个具备跟踪的查询,EF Core建立了数据的跟踪快照原文出处:https://www.cnblogs.com/LiangSW/p/10436894.html