嘿安德鲁，很高兴见到你。
>>嘿迭戈。
>>我们正在谈论 关于实体框架核心
今天，对吗？
>>没错， 我们应该自我介绍吗？
>>是的，当然， 我是Diego Vega和
我担任计划经理 在实体框架团队。
我一直在为此而努力 很长一段时间，那么你呢？
>>大家好， 我的名字是安德鲁彼得斯和
我是一名工程师 实体框架团队。
>>很酷，所以在我们开始之前， 我认为有一些
那些将要成为的人 看这个视频没有
非常了解什么 实体框架核心是关于。
所以我认为我们应该给 一个很短的介绍，
解释它是什么和 它是什么。
>>当然，听起来不错。
>>好吧，我们为什么不跳 到代码并创建一个简单的
应用程序，最小的应用程序 你可以使用EF编写。
>>当然，如此 实体框架核心是
我们所说的 一个对象关系映射器。
所以这真的是一个图书馆 帮助你基本得到和
将数据放入数据库。
这完全是关于查询数据和 允许你修改它
数据，然后保存 那到数据库。
而我们真正给你的 是一种编程模型。
所以你想要那种 多谈一点？
>>我正在谈论 它显示代码时。
>>所以，我们从这里开始， 我认为。
>>好的，这是一个模型 我们称之为一组类
代表一个域名 你的申请是被允许的。
这种情况非常严重 简单的模型，
它实际上被简化了。
它谈论博客， 因为它是一个模型
一个应用程序 做博客。
博客有一堆 的财产。
他们有一个独特的ID 该博客的标识符。
他们也有一个URL 以及因为我们知道
互联网网址也是 事物的唯一标识符。
它成为一种方式 访问博客。
在这种情况下，
它甚至没有名字 因为它超级简化。
但我们有一个主题，因为一个 我们的演示是关于如何改变
主题。
而一个主题也是一个非常 简化表示
什么样的外观 的博客将。
在这种情况下，它已经 一个名字，它有一个颜色
标题，但它可能有 许多，更多的属性。
>>是的，这是显示一个 的高层次特征
实体框架，这就是 建立关系的能力
你的 不同的C＃类。
所以我们称之为这些 导航属性和
EF照顾 为你管理这些。
所以如果我创建一个博客和 设定它的主题，那么你应该
能够保存这两个 事情到数据库很容易
并一起查询它们 如果你需要。
>>是的，这也表明了这一点 你可以有非常简单的课程
对他们有属性和
让他们一起工作 实体框架。
我们将进一步讨论 你可以用他们做什么，
但这非常重要，
并不总是如此 这些类的情况
不需要知道任何东西 关于实体框架核心。
>>是的，等等 有一个特殊的名字，
我们称之为什么？
>>是的，我们称之为POCO，或者 持续的愚昧类，
因为他们没有 需要知道任何事情
关于持久性框架 我们将要使用。
POCO来自Plain Old CLR 对象，这是一个适应
从POJO，这是 那个Java版本。
但那是历史， 基本上。
现在大家都假设 你可以做到这一点。
>>是的，它是什么 真的意味着这是
这些类，
你真的不知道 框架核心可以使用它们。
所以你不必这样做 做任何特别的事。
你有特别的事情 可以做到种解锁
更高级的场景， 但马上就蝙蝠
你可以只写这些类 以一种非常习惯的方式。
>>是的，我们为什么不 切换到视图上下文？
>>好吧，是的，
下一个入口点 这里是在实体框架中，
我们有很高的水平 对象称为DbContext。
这是入口 指出你为之创造
在您的程序中访问数据。
>>是的，最简单的参数 你可以写给UCF的是
将有一个类型 派生自DbContext
定义的类 在实体框架中。
这将会有一堆 这种类型的属性DbSet
这在类上是通用的 你想坚持下去。
所以，如果你设立了一个类 这然后你也需要写
几种方法。
我的意思是，你并不总是需要 写两个，但你需要
至少写覆盖 OnConfiguring，这是
去告诉我们如何去做 主要连接到数据库。
它也可以用来设置 一堆配置
不同的细节和 EF拥有的设置。
并在特定情况下 一个ASP.NET Core应用程序，
你会的代码 通常放在那里，实际上，
我们通常把它放进去 依赖注入容器。
我们可以谈谈 那更晚。
>>是的， 我想我们以后可以展示。
所以，关键在于 即编程模型
是基于继承的，所以
它通常是你继承的 关闭我们的DbContext类型。
这可以让你创建 一个强类型的DbContext for
您的具体应用需求。
在这种情况下 博客上下文，
因为这是为了博客 我们想写的软件。
而博客和主题， 正如迭戈所说，
让我们得到这些数据。
然后是两个模板 您可以覆盖的方法
OnConfiguring，进行配置 例如，你如何连接。
和OnModel创建
配置你将如何 喜欢映射博客和
主题对象的具体 关系数据库中的表格。
>>是的， 我之前说过，
你并不总是需要 写两种方法。
这个想法是，只要你 指定这两个属性
键入DbSet，你的班级，
英孚将会， 在运行时启动时，
用反射来看 这些类型的属性。
并推断需要什么 被坚持和
什么类型使用的 数据库，具体取决于
在数据库上 你告诉EF使用。
所以在这种情况下， 我们有OnConfiguring。
我不知道你是否 可以在那里显示它，
我们有一个方法的代码 这就是所谓的UseSqlServer和
它传递连接字符串。
所以我们知道我们需要使用 SqlServer和基于类型
的博客和 主题，我们将图解
列出哪些类型的列 我们应该创造。
按照惯例，我们可以 弄清楚很多事情，
我们可以弄清楚那些 属性，我们可以数字
他们建立了一种关系 在主题和博客之间，
因为你有一个财产 博客上的类型主题。
但有一些 细节我们不能
自动计算出来。
然后我们有一个API 你可以用来告诉我们。
每次你需要 告诉我们这些细节，
那就是当你必须投入时 代码在更分级内。
>>是的，那我们为什么不展示 这如何更具体地工作。
所以现在， 我们没有数据库。
我们还可以做的是使用 另一块我们的堆栈
我们称之为迁移。
迁移提供 一种基于代码的构建方式
一个数据库模式和 发展它。
我们可以做到这一点 创建一个迁移。
在包中 经理控制台。
我只是要快速设置 这作为我的启动项目。
那里。
现在我在这里做的是我 生成一些代码
将在我们的项目中着陆。
这就是我们所说的 一个迁移文件和
我们可以告诉你 它看起来像什么。
可以，然后呢
在这里我们可以看到它 生成这两个文件。
它打开了一个 我们感兴趣。
其中一个我们可以考虑 一个代码隐藏文件，所以
这是我们管理的一个 你永远不会编辑。
但是这是一个 你无法编辑。
我们默认脚手架， 和
我们的脚手架 这些流畅的API调用。
所以我们有一堆API 对应于典型的数据库
DDL操作。
>>是的，DDL是能力 定义表和
数据上的对象。
>>是的，确切地说。
>>所以这两个电话在这里 代表创造
数据库的表。
这是最初的迁移， 所以这就是迁移
你会用它来创建 一个包含所有模式的数据库
你需要为了 坚持这些课程。
我想我们可以执行它。
>>是的，所以 我们从一张空白的石板开始。
我们甚至没有数据库， 所以我们把这个叫做初始，
这是善意的 我们的第一个。
所以我们有一些 在这里创建表格，
我们会创造 主题表，所以
根据惯例，ef已经决定 调用表格主题。
它是一堆脚手架 和列
它想出了什么 他们的类型应该是。
你可以在这里看到我们正在做的 价值创造战略
那么，这是什么，在SQL中 服务器，我们的惯例是
你想要一个身份 列如果你的主键
是非复合的，而且 像int这样的整型。
>>好的，
>>所以我们有第二个 命令在这里更新数据库。
好的，那是告诉我们的 已经有一个名为的对象
数据库中的主题。
所以可能是这样 数据库已经在那里。
>>是的。
>>那么 让我们快速删除它。
等待这个加载。
不，谢谢。
所以我认为这是一个。
让我们再试一次。
所以我们已经运行了一些这些演示 次，我们需要确保
清理数据库 回到一个干净的石板。
>>好的。
>>所以我们走了， 我们应用了迁移。
所以做了什么就是了 消耗所有这些电话和
执行它们，基本上 要生成的部分
与它们对应的SQL， 和
将其应用于目标数据库 来自连接字符串。
现在应该在这里看到它。
有两张桌子，和 迭戈，这是什么？
>>那个跟踪所有 已经有的迁移
已应用于此数据库。
所以我们也可以推理 关于那个当你说的时候，
好的更新数据库，我们知道 确切地说你有什么迁移
已经在数据库和 哪些需要应用。
>>是的，所以我们实施 那里有一个版本控制策略。
所以我们可以看到这个想法 这里的迁移对应
这个名字在这里。
>>你也会在那看到 现在我们拥有了屏幕底部
一些创建索引方法。
这意味着我们推断这一点 我们需要为其创建一个索引
这种关系 像删除更快的操作
那些表格。
我们还能为此展示什么？
>>我认为我们可以证明这一点， 太。
这很酷。
所以这是一个新的 功能即将到来。
这是能力 也有数据
放入数据库 当你迁移它。
所以我们将这个种子数据称为
在这里我们正在设置 一堆默认的东西。
>>所以如果你很熟悉 你会记得这一点
我们也有迁移，并且 我们有播种能力。
你可以说，没关系，每当 我们创建这个数据库，或者
应用变体，
我们要预先填充一些 有关数据库的细节
数据，然后你可以使用 作为参考数据。
我们决定实施 有些不同。
有不同的设计 我们认为是EF Core
好得多，可以给 你有更多的灵活性。
所以这基本上就是种子 数据是模型的一部分。
而且每当我们计算 和...之间的不同
两款车型， 种子数据也成为一部分
的计算 的差异。
所以每当你添加数据或者 你从模型中删除数据，
我们知道我们需要什么 在迁移中也是如此。
>>是的，所以我们可以证明这一点。
它也适用于 改变数据。
所以在这里我们要改变主题 1实际使用AliceBlue
作为颜色。
而且这也会 举一个例子
的迁移工作流程。
所以现在我们做了这个改变， 我们想分享它
我们团队的其他开发人员， 可能。
所以我们所做的就是我们能做到 创建另一个迁移。
建立。
所以每次你做出改变 这将改变数据库
架构或种子数据，你可以 生成一个新的迁移
现在将被分享 在你的团队中。
他们可以运行它，然后
他们的本地数据库会 被带到现在。
您也可以使用它进行部署 通过脚本来制作，或者
使用代码。
>>我认为我们需要 添加迁移
>>是的，生成。
可以，然后呢
在这里你可以看到它看起来很多 不同于最后一个。
那是因为我们推断出来的 那是唯一的事情
自从我们申请后发生了变 最后一个是这种改变
种子数据。
>>是的，你也看到了 一种向上和向下的方法。
up方法会使 目前这种迁移，
如果我们执行，我们 将要制作数据库
成为当前版本。
>>把它带到现在，是的。
>>是的，如果你告诉我们 你想重新说一句，
那么我们将执行这个 将要设置的下拉方法
颜色回到 之前是什么。
所以我们需要记录 在迁移中。
>>所以倒是真的 回滚到之前的状态，
这可能会在您部署时发生 以生产为例，和
出了点问题。
Down提供退出的方法 最近发生的变化。
>>是的，我们可以显示剧本 我们生成的SQL？
>>当然，这次迁移？
>>我认为是的，是的。
>>脚本迁移。
>>是的。
>>所以这很好，因为你 可以只生成一个脚本，
一个SQL脚本，并把它交给 如果你没有的话，可以给某人
直接访问运行 生产数据库，
这很正常。
>>是的，这给你， 其实，
我们执行这个命令的方式 为您提供整个脚本
创建数据库 从头开始。
>>是的。
>>但它会 包括的值
我们拥有的数据，种子 我们在那里的数据。
>>没错，和 我们应该看到它。
是的，你可以看到 颜色从红色改变。
这是第一次迁移， 然后倒在最后，
我们本应该 第二次迁移。
所以在这里。
>>是的。
>>所以你可以看到它是真的 顺序，这不是我们
只是推测，颜色 应该从AliceBlue开始。
>>是的，还有另一个 那里有趣的细节，
在这个脚本中，我们 正在设置身份插入，
在主题表上，关闭和打开。
那是这样的 我们自动做，
因为在SQL Server中， 如果你知道这一点，
身份列通常 无法更新。
在这个版本的播种 我们有能力做到这一点
因为你在问 一个特定的ID值。
我们会去做任何事情 需要使其具有这种价值。
>>是的。 >>在这种情况下，
我们需要绕过它 为...应用解决方法
SQL Server。
EF的以前版本 没有能力，所以
它无法做到。
>>我不知道它可能会更好 不要引入身份
种子数据列。
>>可能是 那里有一个选项。
>>是的。
好的。
让我们，我们可能是 很好地应用那一个，
我猜， >>是的。
>>使我们保持最新状态。
好吧，现在， 我们还有什么？
好吧，这是公正的 一个我们会的小程序
在上下文中利用你的博客。
而它所做的只是寻找 主题，并打印出来，所以
我们应该运行它 看看我们在哪里。
好的，我们可以看到 是蓝色的，它已被更新，并且
我们基本可以看到这一点 查询数据库超级
简单。
我们可以 写一个正常的
每个循环遍历该DbSet 我们创造的财产。
在下面，做了很多 工作，它正在生成一个查询
数据库，它已经算出来了 如何创建主题对象
有效地执行 非常快。
最终的结果是，
你会回来的 一串主题。
>>好吧，我想我们 应该尽量做一个
显示一些小时的演示 我们所做的基本操作，
除了功能。
>>好的，听起来不错。
>>你哪一个 认为我们可以做？
>>灵活的映射 可能是一个好的。
我们可以谈论一些不同的 创建一个pokas的风格。
>>是的，听起来不错。
>>所以我只是要重置。
好的，我们应该开始吧 与实体类型？
还是实体类型？
>>是的，这个模型只有 一个班级，这是一个博客。
还有一点点 比另一个完整，
因为这个的目的， 他们必须被定义。
我们有更多的属性 像名字一样，
和你的事情 将期望看到。
但我们决定做点什么 特殊的网址，对吧？
>>是的，所以我认为我们是
有兴趣使用一个字段 映射URL。
所以这意味着什么， 默认，
你会经常写你的 有属性的类。
但你不必，你可以 也直接映射到字段。
这提供了一种更多 封装的结构化方式
您的Poka内的数据。
>>是的，也有 一个连续的特征
我们称之为灵活 对象映射。
我们只得到了 从这些开始。
在一开始我们 从支持开始
简单的课程或pokas。
然后我们开始支持 具有属性的简单对象。
现在，我们支持字段映射。
还有一些特点 我们将要工作
在，这使得它更多 灵活，并可以让你
有更多的自由或 你如何设计你的领域更多。
如果你想使用，字典 也许有一天会支持
也为您的物业， 如果你想使用一个构造函数
这需要一些这个属性 值，将会识别它。
那不是我们的事 在转换中，但是
我们要去的东西 正在努力。
>>所以，我们的目标是 真的让你
定义你的类，方式 他们的方式，你想。
然后，让你进行配置 EF能够映射它们
到数据库 你想要的结构。
那些东西 可以种进化，
并分别成形。
>>好的。
所以在这种情况下，我看到了 你添加了一个私有字符串
在此调用URL属性。
>>是的，所以我创造了这个领域。
我只是让财产只读， 和
那么我们有这个方法 我们打电话什么时候要设置它。
这很有用，也许我们 想要执行一些自定义
在这里验证， 所以域逻辑。
这让我们有种 创建更多的封装
执行什么 这意味着要坐在网址上。
>>好的，但从 坚持你的视角
可能需要你的坚持
库只需访问该字段 在那里设定数值，
它是从中读取的 该列和数据。
>>是的，当然。
所以我认为我们需要一点 的配置，对吧？
>> Mm-hm。
>>所以我们有了 多一点流利的API。
它有希望很可读， 我们要说的是
实体博客， 它有一个string类型的属性
称为URL，并且 由这个领域支持。
>>是的，当我们指定的时候 用大写名称URl，
我们通常谈论这些 基本上就是概念
财产，这是一个财产 从概念上讲，
虽然dotNet 班级没有
财产制定者。
我们仍然推论这个事实 那里有财产。
>>是的，所以这是一种，我 猜猜会说混合映射，
因为财产 是否有阅读。
我们有实际的基础 存储在课堂上是这样的
下划线URL字段。
>>我们也认识一些 不同的常见约定
自动命名字段。
所以在这种情况下， 实际上是HasField
只是在那里告诉 我们使用该领域。
>>是的。
>>我想，但即使那样 下划线网址，更低
案件，有我们的东西 将按照惯例予以承认。
>>是的，当然，我得到了我们 例如那将是，
我猜如果我们做到了 像这样的东西。
>>是的。 >>那么
我们有点不同 名称不再匹配，
你认为他们是EF 应该叫？
>>是的。 >>但是
你仍然可以设置 它那样。
>>还有一些其他的 我们支持的变化，
这是没有的 该领域的一切。
我的意思是在这种情况下，我们都是 准备好像一个财产
完全取决于 在那里的领域，
但还有另一种变化 这是呼叫实体的
博客有一个属性 输入名称为URL的字符串。
并没有什么 所有的课程
持有该价值。
>>是的。 >>但那是我们的事情
调用影子属性， 当你有这些时，
EF发生了什么事？ 改变结构，即减少
跟踪修改 你在数据上做出的。
它会保持跟踪 的价值，
保持在实例上 的实体。
所以基本上，我们保持额外的 属性如扩展
属性为你。
>>是的。
所以是的，你会看到 影子属性，
我们在那里完全保存数据 在实例之外。
所以在这里，没有地方 要存储在此的URL。
当我们检索博客时， 我们会给你的博客，和
我们也会跟踪 价值的内部
的网址 每个博客，我们给你。
所以它有点让你的对象 取决于数据库上下文。
还有另一种模式可以 运行，这是没有跟踪。
我们将在哪里跟踪 值以不同的方式
在查询期间。
但那样，我们会的 让你仍然可以查询
例如，不同的URL。
>>你想表演吗？ 如何使用这个模型或
别的东西？
>>是的，我想我们可以很快， 我会运行它。
不是，我可以 只是全力以赴。
>>好的。
>>那么 让我们看看我们的主要。
我们只是做一些数据库设置。
所以在这里，我们可能应该 快速讨论这一点。
所以我们展示了迁移。
这种红色的方式就像 红色应用程序开发
风格，例如 如果你正在测试，那么
你正在运行原型。
所以你想得到一些东西 快速关闭和运行。
我们有这些数据库API，
我们将删除它 整个数据库并重新创建它。
>>是的，这不被推荐 为生产或为
任何超级严重和 复杂但是
这是正确的方式 测试和校对阅读。
>>是的。
以显示。
所以很多这种模式在哪里 我们只是重新创建数据库。
所以我们正在创建 BloggingContext再次，
创建一个博客，设置它的博客 URL，将其添加到数据库。
所以，我想我们展示了一些 我们还没有看到的API。
所以我们看到了一个DBC的查询， 但是DBC，
你也可以添加新的项目 进入和移除物品。
所以这是一种 一个编程模型，
像编程这样的集合 模型为您的数据。
所以你通常做的是， 你有一堆这些电话，
操纵你的哪些物体 想要以哪种方式保存。
然后，保存更改 最后会去的
弄清楚所有这些 变化并应用它们。
所以，我们也登录了，
这是另一回事 值得一提。
实体框架核心 有丰富的博客。
这真的 帮助你理解
那种相互作用 EF与您的后端。
所以在这里，你可以看到，因为 例如，总之创建。
所以我们正在创建 数据库在这里。
这是我们的保存更改插入。
按照平常的博客 一个标识列，所以
我们需要选择 回到价值。
然后，在我们的查询结束。
所以这是查询结束 博客，然后，价值。
所以你可以看看Core是否真的如此 帮助这里，因为这种
自动化一堆东西 你通常需要这样做。
例如，如果你是 使用标识列和
也只是单位 的字样。
我做了一些改变 在客户端和内存上。
我想了解 这些更改并应用它们。
>>是的，所以在这种情况下， 在这个简单的演示中，
我们只有这一个操作 在SaveChanges之前，但是
你可以有多个操作 那里或多个实体。
当有关系时 在他们之间，我们会弄清楚
正确的顺序来应用这些 数据库中的修改。
例如，
子实体总是得到 插入父母之后如此
主键已经存在 存在于数据库中。
只要我们需要 删除一些东西，
我们会这样做 先前的顺序。
>>没错。
>>好的，所以，你认为我们应该 切换到另一个演示，或
有什么有趣的吗？ 在这个我们可以展示的？
>>我们可能需要添加 帖子为它的博客。
>>好的。 >>所以我们可以做到这一点。
所以，我们有点儿 这里演变的模式，
所以我们要创建一个帖子。
这一个我们会有一个， 第二个Id。
也许一个字符串标题，
也许是身体。
我们缺少什么？
所以，我们想把它链接到博客， 对？
这有点回到了什么 我们想要的编程模型
现在在我们的应用。
所以如果你在我们的建议 应用程序，我们得到的博客，
我们希望始终能够访问 博客的帖子，
我们可以这样做，对吧？
>>是的，可能， 我们可以有一个公共名单或 -
>>类似的东西。
博客， 的帖子，对不起。
帖子。
可以，然后呢， 让我们导入ICollection。
现在，我们需要 做别的事吗？
>>我认为在这种情况下，我们 不需要做其他事情，
但我们可以决定我们 也想要有一个链接
该帖子回到博客。
>>好的。
>>你想这样做吗？ 我们可以跳过它？
你的风格是什么？
你如何决定？
>>你在想什么 对博客的引用，或者
你在想什么 像外键？
>>可能是两者，或者 它可能是其中之一。
>>好的。
>>他们都是可能的，而且
每当你没有创造 一个属性，EF核心将要
仍然能够保持 关系。
但如果你想拥有 外键的值
在财产，因为你想要的 在数据库中进行渲染
一些东西，那么你可以做到。
>>当然，就像迭戈一样 说，如果我们没有定义
这里的外键，如果是的话 会介绍一些东西。
它会介绍 像我们一样的阴影属性
之前看过。
所以我们可以观察到这一点。
好吧，我们的数据库 看起来有点不同。
我们现在正在创建 邮政表。
和这里， 你可以看到BlogId。
所以目前尚未定义 在邮政实体上，但是
EF无论如何创建它，并且 英孚将管理其价值。
所以这很好，如果你想要你的 实体类型真的是扑克。
>>是的。 >>而且
没有任何形式的 数据库中的工件。
>>是的。
>>但我们也可以 已经在这里编辑了。
所以，哎呀。
我们可能需要打电话 它有些不同
让我感到有趣。
博客，oops，BlogFK。
>>所以现在， 我们期望发生什么？
>>我希望EF能够， 你想要我说谎吗？
你想要我吗？ 说实话？
>>说实话。
>>好的，EF不会 能够弄清楚这一点
一个外键。
这应该是指向 主键在另一边。
所以这是考虑 这是一个正常的属性
因为我们没有跟随 正确的命名约定。
>>是的，我认为这是正确的。
所以EF有很多 在那个尝试中建立的约定
识别常见模式 为了排序配对。
所以如果我们看到一个属性 这里称为BlogId
匹配其中之一 我们的约定。
所以这个惯例是， 我们发现了一个孩子的财产
与。相同的名称 父级的主键。
所以这很自然 我们的方式来匹配的东西。
但是，如果你打电话给这个BlogFK 那不符合我们的一个
现有的公约。
所以我们期望的是 大概是另一个影子FK。
>>是的。 >>是的，等等
在这里，你可以看到 我们已经到了那里。
>>是的，你的财产 要求创建，但是
这不被考虑 一个外键。
你还创造了 一个影子外键，和
造成了外键约束。
>>好吧，我们来解决这个问题。
>>有几个 实际上修复它的方法。
>>是的，流利。
所以一种方法是Fluent API。
我们希望，对不起， 我们要配置
因为我们是博客 要配置，
有很多。
所以这是我们的方式 针对帖子的'
在博客上收藏。
所以这需要一个lambda。
所以现在，我们已经解决了 帖子的导航。
因为我们需要这样做 告诉EF我们想要什么
配置。
>>好的。
>>我们称WithOne。
这只是让我们得到 外键配置
并明确地呼出 没有后台参考
从帖子到博客。
这是ForeignKey。
现在我们可以做强类型， 因为我们有财产，所以
它应该是可用的 在智能感知。
所以这个流利的API是适合的 围绕智能感知，
就能够而言 点东西和
参考这样的事情。
看起来不错？
>>是的，它看起来不错。
>>我们走了。
所以影子属性消失了 我们已经将EF配置为
明确使用该属性 我们想成为外键。
>>是的，你可以看到 付费也是。
>>是的。 >>好的。
那么我们还能在哪里展示？
你想聊聊吗 关于表现还是？
>>我们可以展示一些 其他的东西，也许。
所以我们可以谈谈 关于功能或 -
>>我认为这听起来不错。
>>好的。
所以这是一个新功能 这在EF Core 2.0中。
你想谈谈吗？ 它大概是什么？
>>是的，所以我们有一些 反馈很长一段时间
来自希望我们的人 改进我们的功能之一。
所以功能是 称为自我加载，但是
我们通常将其称为 包含方法，因此
你如何指定你想要的 在您的查询中加载？
>>那么这意味着什么？
>>所以这种方法是说 我们，无论你什么时候查询
这个查询中的博客，我们应该 也涵盖了这种关系
它必须发布。
有一个导航 财产和
带来这个职位的实例 以及部分结果。
>>好的，这很有道理。
所以当我列举 我回来的所有博客，
这将被填充 与所有职位。
>>是的，确切地说。
所以人们一直都是这样 告诉我们一段时间就是这样
他们不一定要 包括所有的职位，
他们想申请 包含的过滤器。
例如，让我们这样说 该用户一直在写博客
多年和 它有太多的帖子和
我只想登录 去年的那些。
>>我明白了，好吧。
>>这就是这个功能 我们一直在谈论。
我们看看它
我们决定我们不想要 设计它就像那样。
但我们想要一些东西 这是更具说明性的
说的能力 在道德层面。
好的，只要你准备好了 暂停，应用此过滤器，
当然你会去的 有办法把它关掉，但是
一般默认情况下， 只需应用此过滤器。
所以我们想出了 这是一个解决方案。
这就是我们所说的 有时降低查询过滤器，
有时更多级别的查询 过滤器，有时只是过滤器。
>>是的，只是为了做到这一点 更具体一点，就是你的方式
过滤和链接显然 这是什么方法。
所以这可以让你 定义一个谓词
这将被用于或者 包括或排除结果。
那么这个特性允许什么 基本上是能够
在模型创建中定义 以这样的方式，它会
始终将其应用于查询 的目标类型。
这个例子我们基本上设置 两个过滤器，因为我们
试图实施两个 横切行为。
我们要实施 软删除。
所以标记一行的能力 在数据库中被删除
实际上没有 在物理上删除它。
然后多趋势， 所以能力相关
数据库中的一行 租客ID，这样的
我们以后只能退缩 给定租户的数据。
所以。
从第一个开始。
在这里你可以看到那个API，所以 这是一个非模型创建，
再次， 我们解决实体问题。
所以这是帖子。
>> Mm-hm。
>>和IsDeleted是 实际上只是一个财产
第一类财产 在实体本身。
所以我们没有使用阴影 财产或任何东西，
我们刚创建了这个属性 也许我们需要在UI和这个
也许这只是风格 我们想要使用。
所以我们能够轻松，
基本上写一个小链接 谓词片断在这里和
与之相关联 我们模型中的元数据。
>>是的，事实就是这样 一个财产使之成为可能，
并且因为我们添加了一些代码 我们要展示和
在这搜索。
现在你有两种方法 将实体标记为已删除，
你可以设置 该属性为true，或者
你可以调用API 删除实体。
我们有一些我们放的代码 在SaveChanges中，这正在发生
基本上翻译 去除修改。
所以这是一个代码。
特别是每当你保存 在你真正的变化之前
保存更改 数据库，我们将看看
用于所有变更追踪 我们的作品
是标记的附属的职位。
我们将要切换 那回到修改和
把财产和 正确的状态如此
该标记被删除， 已删除。
>>是的，如此 这是一个很好的例子
更高级的扩展 点你可以使用，
这只是为了覆盖 有点变化。
这个工作的方式是， 内部在数据库上下文中
我们有这些东西 称为条目。
一个条目实际上是一个数据 围绕着一个的结构
我们提供的对象 你，这是一种负责任的
跟踪它的原始 数据，任何新数据
任何有的变化 被做了，那种事。
所以，而不是改变，你可以 操作这些条目之前
我们实际上阅读它们来制作 最后一组更改呼叫。
>>是的。 >>就这样
我们在这里做什么。
找到所有的 说他们删除了
把它们变成修改过的。
>>是的。 >>虽然也设置
新的价值 这个删除的属性。
>> Mm-hm。 >>所以这非常有用。
>>所以你想表演 多租赁部分？
你是否想要 只是执行查询？
>>当然，我们为什么不首先， 我要做的是
认为它是有用的 禁用该过滤器。
我说过启动项目吗？
>>是的。
所以这是我们的种类 的初始状态，
我们没有得到任何东西 尚未定义过滤器。
我们可以看到我们是 查询所有的博客和
帖子，我们越来越 租户给所有人，和
我们正在全力以赴 删除和不删除。
>>是的。 >>所以，这是有点。
现在，查询是天真的。
我们将启用 软删除过滤器。
再次运行它。
好，好极了。
我们只得到 IsDeleted:False。
所以我们很容易实现 它就像一个横切
我们想要实施的前冲 在我们的应用中
>>是的。
>>这就是这样 影响实体
我们带来了结果 作为include和的一部分
不作为主要实体的一部分 我们正在创造。
>>确实如此，如果你还记得，
我们列举的方式 这些事情就是我们所为
带来的职位一起 博客，然后我们只是
做这个嵌套循环关闭 导航属性。
因此，您可以在查询中看到
当我们选择的帖子 我们只需在筛选器上选择。
这很好。
>>是的。 >>现在这个过滤器也会
如果我查询应用 发布最高级别。
它会适用于我，
我们为其生成的任何查询 帖子。
>>是的。
>>就是这样。
如果，你如何选择退出。
>>是的， 你必须关掉它。
我们应该表明吗？
很快，和 那么我们可以继续。
好吧，让我们说你的 应用程序有一个管理屏幕
管理员可以去 在和取消删除这些东西。
这是你的方式 执行那个。
IgnoreQueryFilters只是转向 关闭所有的过滤器
查询。
所以我们再让他们回来。
这有点像退出。
>>好的。
>>好的多趋势？
>>听起来不错。
>>有点不同，
你想解释为什么 我们有这个区别？
>>是的。
所以这是多一点 我比猜想更复杂
数据过滤器，因为第一 我们有一个租客
DE上下文类中的ID字段 我们需要参考。
所以我们需要与租户相匹配 该特定实例的ID
与上下文的关系 数据库上的实体。
我们正在跟踪这个问题 事实上，当查询过滤器
被定义， 做索引执行
创造方法 在第一个上下文中。
这可能是一些tenantId 那是我们的目标网站
第一个例子。
>>是的。
>>我们有这个优化 我们没有执行它们或
创造方法 你使用上下文的时间。
我们只执行一次。
我们创造他们所有和 我们缓存它。
但我们想永远 使用当前值
这_TenantId字段。
接下来的其他部分很少 有点复杂的是这个
进入 EF.Property方法。
有一种方法可以 访问查询属性
使用适用的F内核 每个属性。
它基本上适用于 一流的属性，
在课堂上的属性， 它适用于较浅的属性，
它也适用于属性 映射到这些字段。
这也是一个 有趣的一点
因为你看到了它 从EF课程开始。
你想谈一点 关于我们在那里做了什么？
>>当然。
是的，所以我们需要
基本上就像一个静态条目 点我们可以的API，
你可以参考 任何地方很容易。
所以我们对那些EF有所了解 上课，这一切都是
静态和非常容易找到和 很容易打字。
所以我们有一些 这些静态API和
他们将全部挂起 关闭这个EF课程。
另一个是我 猜测编译查询。
所以这些静态方法 让你更先进
通过采取查询性能 通过缓存查询
例。
然后我们有这个功能 财产，让你，
类似EF的财产，但 在链接查询中明确
指定数据库功能 使用CLI方法。
>>是的，有这个静态 入口点观众有
非常好的可发现性 API，所以基本上你可以学习
EF通过探索什么是 挂在这个班上。
当然是从 DE上下文类。
所以那两个是主要的
实体指出 你必须使用。
任何与之无关的东西 当前的DE上下文实例
你正在使用，将会 主要是挂在EF。
>>是的，就像迭戈说的那样 在我们没有的博客中
一个tenantId属性，就这样 类似于我们的第一个例子
正在谈论，我们在哪里 只是使用一个字段映射。
所以我们这样引用它。
>>是的，我们做了一些事情 这也是这个，对吧？
>>是的，我们也做到了 同样的事情，所以
只是退后一步， tenantId进入的原因
这里的构造函数是因为 考虑一个Web应用程序。
每一个请求都会得到一个新的 博客上下文实例。
而作为其中的一部分，
作为请求本身的一部分 我们会有一些应用逻辑，
弄清楚什么是房客 应该是为了那个请求。
然后我们会创造 与该租户的上下文，所以
基本上对此进行了区分 上下文到给定的租户。
所以我们知道这个例子 是给定租户的。
我们已经设置了过滤器 那么我们保存了更改。
我们可以从保存的变化中获得 实际上可以坐在租客身上
因为我们有 这里有正确的价值。
>>是的。
>>因此，任何实体 加入确认
tenantID就坐 到目前的租户。
>>好的，你想试试吗？
>>好的，那么 我们只得到了Diegos，
我认为这就是我们想要的。
我们来检查一下。
>> Mm-hm。
>>是的，我们走了。
我认为我们可以改变它。
所以这里的一个关键点是善意的 Diego所指的是什么
之前或之后 模型创建一次，
我们检测到下划线 租户ID实际上应该是
查询中的一个参数。
所以你可以在这里看到 它的参数化。
所以查询被编译一次， 每次运行时，
获取上下文实例 这是运行它，
从中拉出租户ID 并将其放入查询中。
>>我想展示一些链接， 资源。
所以这基本上是一些链接 你可以用它来学习
更多关于实体框架核心 以及如何使用它。
我们有所有的演示 我们今天一直在展示，
那些在一个存储库中 GitHub在安德鲁的账户下。
这anpete efdemos和
那么我们有我们所有的来源 代码和我们的问题跟踪。
所以我们回溯 这一切都在GitHub上。
它在这个http.net中 核心存储库，
我们有 文档也在
微软文档 EF核心网站。
还有，
我们很快就会去 有实体框架6
文件旁边 这个在EF 6下。
这些是我们的Twitter帐户， 我们有一个官方帐户
EF被称为 @efmagicunicorns，那
如果你遇到任何事情 你找不到答案
一个堆栈溢出的问题。
或者你找不到方法 告诉你看到的东西
是一个错误或什么，你可以 优先考虑我们在那里和
我们会回应。
和个人的，和 那么我们有这个博客
.NET博客，我们使用每一个 我们有一个公告。
那么别的什么 我们应该谈谈？
>>不，只是鼓励那些人 有兴趣查看
我们的GitHub项目，甚至是 潜在的尝试和贡献。
所以我们有一群人 已经做出的
贡献，我们超级 当我们拉动时激动
来自社区的请求，没有 事关多大或多大。
>>是的，也是ASP.NET 文档包含一些
有趣的教程 包括使用EF核心和
在EF Core的文档中 你会找到一些
解释 具体功能。
我建议你什么时候 你正在努力学习如何
使用EF Core ASP.NET的上下文
核心是真的 良好的资源。
>>谢谢。