[ ] 嗨。我是卡姆·索珀
内容开发人员在此处 微软正在.
今天在这个视频中，
我们要开始 与实体框架核心，
这是一个工具集，使它 易于your.NET对象存储在
各种数据库，没有 写很多，如果任何数据库代码。
我们数据库 要构建支持
在线零售商康托索宠物，
销售狗玩具。
客户表可以具有
零个或多个订单 与它相关，
每个订单都有很多 与之相关的产品。
这可以通过
交点表
促进多对多 关系。
让我们开始演示。
我有一个空控制台项目 这里创建了with.NET核心 3.0。
我要去管理 我的NuGet软件包，
我在寻找 微软.实体框架核心。
我要抓住 微软.实体框架核心.SqlServer
打包并安装到我的项目中。
现在，这已经安装， 我也要去
安装 微软.实体框架核心.设计，
和 微软.实体框架核心.工具。
开始使用 实体框架核心，
我们需要建立一个实体模型。
按照惯例，这通常是 存储在称为模型的文件夹中。
我们要创造 第一张桌子，
可能是最简单的，产品。
因此，我们添加了一个空类，
我要使用视觉工作室
用于保存一些键入的代码段功能。
查看产品 类，因为我们已经建立它，
我想打的第一件事 是此第一个属性 ID。
在实体框架核心中，
ID 是一个特殊的标识符，
指示此属性为
被视为主键。 生成表。
不必只是身份证
它可以是表名后跟ID，
或者它可以是任何东西，我们 希望它是，我们标记
具有键属性的属性
以指示它是主键。
其他两个属性 这个类是名字，
我们已标记为必需 使用数据属性，
和价格，我们已经指出
是具有两个的小数位 精度的小数点。
下一节课，我们要 添加将是客户类。
客户类看起来有点
不同，因为 这一次，我们使用
可否定的引用 类型特征
C# 指示允许的字段 空，哪些没有。
自名字和姓氏起 不是可空字符串，
实体框架知道 当它创建表时，
这两列 不应允许 null。
地址和电话属性
另一方面是 可空字符串，
因此，实体框架将 允许这些列中的 null。
最后，最后一个属性 在类称为
订单是集合 顺序对象。
我们尚未创建 订单类，
我们要这样做 在短短一秒钟。
这称为导航属性，
它表明，一个客户 可能有零个或多个订单。
这将创建 一对多关系
在生成的数据库中。
创建空订单类，
我将再次使用代码段填充 我在类中的属性。
这不应该引入 任何新概念。
我们有我们的身份证财产
我们的订单下财产 这是一个日期时间，
订单完成属性，获取
在订单时填充 实际上实现了，
我们已经实现了 是一个空日期时间，
所以数据库将允许 该列中的 null。
我们也有一个客户对象
这是另一种类型 导航属性，
每个订单一个客户。
我们有客户 ID 属性表示
外键关系
客户表， 将生成。
如果我们没有包括 客户 ID 属性，
没关系，实体框架核心
会创建它反正 作为卷影属性。
最后，我们还有另一个 导航属性
指向我们的十字路口 表，产品订单。
我们要上的最后一堂课 创建是交点表。
交点表产品订单
促进 多对多的关系。
它有导航属性 订单和产品。
就像其他类一样
订单 ID 和产品 ID 表示
外键关系和 并非严格要求。
现在我们要创建 数据库上下文类。
按照惯例，这通常 进入名为"数据"的文件夹中。
我要说出我的名字 类 ContosoPets 上下文。
康托索·佩斯上下文 派生自数据库上下文。
将 DBContext 视为表示 与数据库的会话。
在 DBContext 派生类上，
我们有四个属性 类型 DBSet。
每个 DBSet 表示表
将在数据库中创建。
最后，我们覆盖了 打开配置方法
包括一些 配置信息。
因为我们使用的是 SQL 服务器包，
我们有一个使用 SQL 服务器 扩展方法可供我们使用
指示实体框架 我们使用 SQL Server。
我们通过连接 字符串，顺便说一下，
你也许不应该 硬编码连接字符串，
我们只是这样做 演示目的。
所以现在我们已经创造了 我们的实体模型，
我们要创造 所谓的迁移。
迁移是使迁移成为
易于创建和 发展我们的数据库。
我要使用 包管理器控制台到
运行该广告迁移命令。
我要说出我的名字 迁移初始创建。
让我们来看看 生成的代码。
与某些生成的代码不同，
这个代码是我们维护的。
我们应该把它看过来 确保它准确
它创建表 我们希望它被创建的方式。
例如，查看 在产品表中，
我们可以看到它在哪里 创建我们的身份列，
我们的主要密钥，我们的名字 它不是空的，
和我们的价格，这是
小数点小数，小数为两位 精度点。
所以现在我们很满意 迁移是正确的，
我们将运行迁移 更新数据库命令let。
是跑的因此，让我们来看看 在创建的数据库中。
我们要看的第一张桌子
是这个，我们 根本不创造
此 EF 迁移历史记录。
此表由 实体框架核心，
所以它知道哪些迁移有 已针对此数据库运行。
让我们看一下产品表。
看起来产品表是
生成完全按照我们的预期。
让我们也看看客户。
还生成了客户表 几乎正如我们所期待的一样
除了我意识到我忘了 以添加电子邮件列。
让我们回到 客户实体和
电子邮件的属性。
电子邮件将是一个空字符串。
现在我们已经修改了 客户实体，
我们将创建另一个迁移。
我将命名此 AddEmail。
如果我们看一下这个迁移，
我们看到它非常简单。
它所做的只是添加一列。
让我们继续前进，运行 再次更新数据库，
以确保我们的数据库 最新的迁移。
正如预期的那样，电子邮件列 已添加到表中。
现在我们已经建立了我们的数据库 在我们的实体模型中的上下文，
让我们做点什么吧。
开始，我要
向 我的产品表。
我要要做的第一件事 做的是我要使用
a 使用声明创建
ContosoPetsContext 的新实例。
此使用声明可确保
ContosoPetsContext 对象是
妥善处理， 当我们完成使用它。
我要添加的第一个产品
我的桌子将是一个吱吱作响的骨头。
你会注意到，我创建的 吱吱作响的骨对象，然后添加
它到产品表上 数据库上下文发生率。
下一个产品我 要添加将
是三包网球。
请注意，我添加了此 直接到上下文，
我不需要添加它 到产品表。
这是因为实体 框架知道，这是
产品实体和
它知道它属于 在产品表上。
最后，我们要打电话 在上下文中保存更改。
让我们运行它，看看会发生什么。
正如预期的那样，两个产品 已添加到产品表中;
我们吱吱作响的狗骨头和 我们的网球三包。
好了，现在我们 添加的信息，
我们创建了一些实体，
让我们尝试阅读信息 从数据库中。
使用相同的康托索 宠物数据库上下文，
我要查询产品 使用流畅 API 的表。
流畅的 API 使用扩展 方法链
方法一起和 lambda 表达式来指定查询。
在这种情况下，我们正在寻找
任何产品的价格 大于五，
我们要按名字点菜
然后，我们只是要写 这一切都到控制台。
如果你不喜欢 流利的 API 语法，
您还可以使用链接语法。
链接语法非常 类似于 SQL 代码。
让我们替换流畅的 API 语法与链接语法。
这两种方法 等效和
结果相同 对数据库的查询。
正如预期的那样，我们的一个产品
价格大于 结果中显示了五个。
现在，我们已经阅读 来自数据库的数据，
让我们尝试编辑记录。
编辑记录，首先我们 必须获得它的参考。
我们将查询表查找
适用于其名称的任何产品
是吱吱作响的狗骨头和 采取第一个或默认值。
在这种情况下， 有没有记录，
与该名称匹配，我们将得到一个 null。
因此，我们将检查，看看是否 吱吱作响的骨骼对象
是产品，而不是空产品，
如果是的话，我们会 将价格设置为 799。
最后，我们将保存我们的更改。
自从我们改变了价格 大于五，
吱吱作响的狗骨头出现 现在在结果集中。
最后一件事我们 要显示是如何
从数据库中删除记录。
要删除，您只需 传递对
删除函数的实体 在数据库上下文中。
这就是使用起来的容易
要存储的实体框架核心 your.NET数据库中的对象。
在下一个视频中， 我们要展示如何
以使用现有数据库。
同时，如果你想 尝试交互式教程
实体框架核心，去 到aka.ms/Learn-EF-Core。