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的建模步骤,下文对此过程进行更详细的说明

  1. EF Core查看DbContext并找到所有公共的DbSet属性,并使用属性名为表定义初始名称.
  2. EF Core查看DbSet的泛型类,查看类的属性构建列名,类型等. 它还会查找类和属性用于提供额外建模配置的特殊Attribute
  3. EF Core查找DbSet类中引用的其他类. 在我们的例子中Book类有一个对Author类的引用,所以EF Core也会查看它. 它对Author类执行与步骤2相同的操作. 同时它使用类名Author做为表名
  4. 建模过程的最后一个步骤, EF Core运行DbContext的虚方法OnModelCreating, 可以通过重写OnModelCreating方法使用fluent Api进行更多的建模配置,但本例中为了保持示例的简单并没有这样做
  5. 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内部,看看不为人知的故事...

从数据库中读取数据的过程如下

  1. 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]
  2. 数据库提供程序读取数据后,EF Core通过以下过程放置数据: (a) 创建.NET类的实例 (b) 使用数据库关系链接(外键),通过引用(称为关系修复)将.NET类链接在一起. 结果是一组以正确方式链接的.NET类实例. 在本例中两本书有相同的作者Martin Fowler,因此这两本书的作者属性指向同一个Author类
  3. 由于代码中包含 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列如何更新的详细说明

  1. 应用程序使用LINQ查找包含作者信息的单个图书,EF Core将LINQ查询翻译为SQL命令,读取Title为Quantum Networking的行,返回Book和Author类的实例,因为使用了Single查询,所以还会检查是否只找到一行
  2. LINQ查询中没有AsNoTracking方法,所以该查询是一个具有跟踪的查询,EF Core创建了数据的跟踪快照
  3. 然后代码更改了Book的Author的WebUrl属性. 当调用SaveChanges时, 检测更改阶段会将跟踪的所有类与跟踪快照进行比较. 在这里它会检测到所有已更改的内容. 在本例中主鍵为3的Author实例的WebUrl属性值被更改
  4. 检测到更改后,EF Core将启动事务. 每个数据库更新都以原子单位完成: 更改全部成功或者全部失败. 这非常重要,因为如果仅应用了部分更改,关系数据库可能会发生严重的错误
  5. 更新请求由数据库提供程序转换为SQL命令,如果执行成功则提交事务并返回SaveChanges方法,否则会抛出异常

[翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的的更多相关文章

  1. EF Core in Action 中文翻译 第一部分导航

    Entityframework Core in action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core ...

  2. [翻译 EF Core in Action 2.3] 理解EF Core数据库查询

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  3. [翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

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

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  5. [翻译 EF Core in Action 2.0] 查询数据库

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  6. [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  7. [翻译 EF Core in Action 1.11] 何时不应该使用EF Core

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  8. [翻译 EF Core in Action 1.8] MyFirstEfCoreApp应用程序设置

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  9. [翻译 EF Core in Action 1.7] MyFirstEfCoreApp访问的数据库

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

随机推荐

  1. css那些事(一)

    一.内边框padding和外边框margin属性缩写 内外边框有四个属性:padding-top,padding-right,padding-bottom,padding-left;margin-to ...

  2. 关于引用(python中的伪指针)的理解

    # 总结:个人理解,引用不可变的的变量时,随着改变会指向新的地址 # 引用可变的变量时,位置不会随着变量改变而改变 a = 1 b = a print(b) a = 2 # 指向了新的内存地址 pri ...

  3. USB/GPIO/SDIO

    通用串行总线(英语:Universal Serial Bus,缩写:USB)是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范.它只有4根线,两个电源(5V,地线),两个数据 ...

  4. Linux时间子系统之(十七):ARM generic timer驱动代码分析

    专题文档汇总目录 Notes:ARM平台Clock/Timer架构:System counter.Timer以及两者之间关系:Per cpu timer通过CP15访问,System counter通 ...

  5. 监控与管理dubbo服务

    Dubbo是阿里多年前开源的一套服务治理框架,在众多互联网企业里应用广泛.本文介绍了一些如何监控与管理dubbo服务.使用的工具与<dubbox 的各种管理和监管>大致相同,本文更侧重于命 ...

  6. 用react重构个人网站 3-22

    问题一:import React from 'react'这个写法是怎么回事? 答案:require是common.js的写法,import是ES6的写法,主要功能都是引入模块,写法上: var mo ...

  7. java基础之接口(抽象类与接口的区别)

    概述 猫狗案例,我们想想狗一般就是看门,猫一般就是作为宠物了,对不.但是,现在有很多的驯养员或者是驯的,这应该属于经过特殊的培训训练出来的,对不.所以,这些额外的动作定义到动物类中就不合适,也不适合直 ...

  8. Android推送 百度云推送 入门篇

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27231237 现在app基本都有推送的功能,于是看了下百度云的推送,官方文档和D ...

  9. asp.net core session丢失问题排查

    最近公司采用asp.net core的站点在外测环境中,总是发现存在session丢失的情况.排查了好久,客户端.AspNetCore.Session的cookie未丢失,session的分布式缓存采 ...

  10. BZOJ_[JSOI2010]Group 部落划分 Group_kruskal

    BZOJ_[JSOI2010]Group 部落划分 Group_kruskal Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人 ...