杨中科 EFCORE 第四部分 命令详解56-61

Migrations

深入研究Migrations

1、使用迁移脚本,可以对当前连接的数据库执行编号更高的迁移,这个操作叫做“向上迁移” (Up),也可以执行把数据库回退到旧的迁移,这个操作叫“向下迁移(Down)
2、除非有特殊需要,否则不要删除Migrations文件夹下的代码。
3、进一步分析Migrations下的代码。分析Up、Down等方法。查看Migration编号。4、查看数据库的_EFMigrationsHistory表: 记录当前数据库曾经应用过的迁移脚本,按顺序排列

示例:
程序结构

Person 类

杨中科 EFCORE 第四部分 命令详解56-61_第1张图片

PersonConfig

杨中科 EFCORE 第四部分 命令详解56-61_第2张图片

MyDbContext

杨中科 EFCORE 第四部分 命令详解56-61_第3张图片
杨中科 EFCORE 第四部分 命令详解56-61_第4张图片

主程序类
杨中科 EFCORE 第四部分 命令详解56-61_第5张图片

运行:
杨中科 EFCORE 第四部分 命令详解56-61_第6张图片

此时查看 Migrations下生成的文件
杨中科 EFCORE 第四部分 命令详解56-61_第7张图片

发现文件中有两个 方法 分别是 up 和 down
up 方法是创建过程 向上迁移

杨中科 EFCORE 第四部分 命令详解56-61_第8张图片

down 是向下迁移 up创建了表 ,会滚的话 就是删除表

杨中科 EFCORE 第四部分 命令详解56-61_第9张图片

此时若是增加一列
杨中科 EFCORE 第四部分 命令详解56-61_第10张图片

执行命令(在实际开发中,不能操作过于频繁)

在这里插入图片描述

此时,Migrations文件中,新增了一个脚本 up方法中的内容也发生了改变,是增加一列
(文件前面的编号内容也在增大)
杨中科 EFCORE 第四部分 命令详解56-61_第11张图片

此时的向下迁移 down 方法
则是删除该列
杨中科 EFCORE 第四部分 命令详解56-61_第12张图片

执行 Update-Database

在这里插入图片描述

查看数据库内容

杨中科 EFCORE 第四部分 命令详解56-61_第13张图片

查看EFMigrationsHistory

杨中科 EFCORE 第四部分 命令详解56-61_第14张图片
ProductVersion : EFCORE 版本
MigrationsId : 显示数据库都执行了哪些脚本

这个表 是由EFCORE 维护

若估计删除表中一行记录
杨中科 EFCORE 第四部分 命令详解56-61_第15张图片
然后执行update-database
在这里插入图片描述
出现报错信息
杨中科 EFCORE 第四部分 命令详解56-61_第16张图片

列重复。

数据库其他迁移命令

Migrations其他命令

1、Update-Database XXX把数据库回滚到XXX的状态,迁移脚本不动
2、Remove-migration删除最后一次的迁移脚本
3、Script-Migration
生成迁移SQL代码。有了Update-Database 为什么还要生成SOL脚本。
可以生成版本D到版本F的SOL脚本:Script-Migration D F
生成版本D到最新版本的SOL脚本: Script-Migration D

Update-Database XXX

示例:
删除数据库
杨中科 EFCORE 第四部分 命令详解56-61_第17张图片

执行 Update-Database
杨中科 EFCORE 第四部分 命令详解56-61_第18张图片

此时数据直接到 AddHeight 版本
杨中科 EFCORE 第四部分 命令详解56-61_第19张图片
使用 Update-Database xx 尝试还原到上一个版本
杨中科 EFCORE 第四部分 命令详解56-61_第20张图片

刷新数据库,发现还原成功
杨中科 EFCORE 第四部分 命令详解56-61_第21张图片

表中记录也减少一条
杨中科 EFCORE 第四部分 命令详解56-61_第22张图片

再次 执行 删除数据库操作。
此时需要达到 只执行到Init 状态,不执行到 add height
杨中科 EFCORE 第四部分 命令详解56-61_第23张图片
测试成功
杨中科 EFCORE 第四部分 命令详解56-61_第24张图片

Remove-migration

为了防止不小心 删除了 破环了前后关系,最好不要手动删除迁移脚本
而是使用 Removing 命令 删除最近一次记录
杨中科 EFCORE 第四部分 命令详解56-61_第25张图片

Script-Migration

在这里插入图片描述

此时在编辑器 中打开了一个sql文件

杨中科 EFCORE 第四部分 命令详解56-61_第26张图片
这样的目的 是在项目上线后,修改数据时,能更直观的看到如何修改得数据库 ,防止不小心的操作破坏生产环境

生成中间版本 到某个版本的迁移脚本
在这里插入图片描述
sql脚本
杨中科 EFCORE 第四部分 命令详解56-61_第27张图片
再把该代码 复制到数据库中运行
杨中科 EFCORE 第四部分 命令详解56-61_第28张图片

结果:

在这里插入图片描述

Script-Migration D 生成某个版本到最新版本的数据迁移记录
杨中科 EFCORE 第四部分 命令详解56-61_第29张图片

EFCORE 反向工程

反向工程

I、根据数据库表来反向生成实体类
2、Scaffold-DbContext ‘Server=.;Database=demol;Trusted_Connection=True;MultipleActiveResultSets=true’
Microsoft.EntityFrameworkCore.SqlServer

开发一个项目,但这个项目已经有了一些数据库。这个时候可以考虑使用反向工程

示例:
新建数据库
杨中科 EFCORE 第四部分 命令详解56-61_第30张图片

新建表
杨中科 EFCORE 第四部分 命令详解56-61_第31张图片
命令输入执行
在这里插入图片描述
此时项目中自动生成了 Dbcontext 和 Person 类
杨中科 EFCORE 第四部分 命令详解56-61_第32张图片
杨中科 EFCORE 第四部分 命令详解56-61_第33张图片

注意

1、生成的实体类可能不能满足项目的要求,可能需要手工修改或者增加配置。
2、再次运行反向工程工具,对文件所做的任何更改都将丢关
3、不建议把反向工具当成了日常开发工具使用,不建议DBFirst.

FECORE 底层如何操作数据库

Know How

1、为什么需要了解EF Core底层原理
框架是简化操作,不是让程序员变成傻瓜

杨中科 EFCORE 第四部分 命令详解56-61_第34张图片

EFCORE 底层就是靠 ADO.NETCORE来操作的
杨中科 EFCORE 第四部分 命令详解56-61_第35张图片

原理:

杨中科 EFCORE 第四部分 命令详解56-61_第36张图片

查看生成的SQL语句

1、SOL Server Profiler(收费版才有)查看SOLServer数据库当前执行的SQL语句。
杨中科 EFCORE 第四部分 命令详解56-61_第37张图片
查询窗口执行过的sql 语句 在SQL Server Perfiler 就能监控到
杨中科 EFCORE 第四部分 命令详解56-61_第38张图片

杨中科 EFCORE 第四部分 命令详解56-61_第39张图片
代码方式

杨中科 EFCORE 第四部分 命令详解56-61_第40张图片
杨中科 EFCORE 第四部分 命令详解56-61_第41张图片

2、var books = ctx.Books.Where(b =>b.Price > 10 b.Title.Contains(“张”));

EF Core把C#代码转换为SQL语句的框架

EFCORE 有哪些做不到的事情

Why

1、C#千变万化;SQL功能简单。存在合法的C#语句无法被翻译为SQL语句的情况

var books = ctx.Books.Where(b => IsOK(b.Title));
private static bool IsOK(string s)
{
	return s.Contains("张");
}

示例:
杨中科 EFCORE 第四部分 命令详解56-61_第42张图片
杨中科 EFCORE 第四部分 命令详解56-61_第43张图片
语句成功被翻译成为sql
在这里插入图片描述
修改代码
完全可以编译通过的合法sql 语句
杨中科 EFCORE 第四部分 命令详解56-61_第44张图片
报错,该Linq 表达式 无法被翻译为sql
杨中科 EFCORE 第四部分 命令详解56-61_第45张图片
sqlseverprofiler中也没有记录
在这里插入图片描述

杨中科 EFCORE 第四部分 命令详解56-61_第46张图片

通过代码查看EFCORE 生成的SQL

Why

不是有SQL Server Profiler了吗?
SQL Server Profiler 是查看服务器上所有的SQL 语句,多人操作。

方法1: 标准日志

public static readonly ILoggerFactory
MyLoggerFactory
= LoggerFactory.Create(builder => builder.AddConsole(););
optionsBuilder.UseLoggerFactory(MyLoggerFactory);

示例:
nuget 查找 logging console
杨中科 EFCORE 第四部分 命令详解56-61_第47张图片
在这里插入图片描述
编写代码
杨中科 EFCORE 第四部分 命令详解56-61_第48张图片
杨中科 EFCORE 第四部分 命令详解56-61_第49张图片
运行:
杨中科 EFCORE 第四部分 命令详解56-61_第50张图片

方法2:简单日志

optionsBuilder.LogTo(Console.WriteLine):
可以自己写代码过滤一些不需要的消息

示例:
杨中科 EFCORE 第四部分 命令详解56-61_第51张图片

运行结果:

杨中科 EFCORE 第四部分 命令详解56-61_第52张图片
只输出跟sql语句相关的东西
杨中科 EFCORE 第四部分 命令详解56-61_第53张图片
运行结果:
杨中科 EFCORE 第四部分 命令详解56-61_第54张图片

好处:可以看到更细节的东西,不用引入logging的框架

方法3: TOQUERYSTRING

1、上面两种方式无法直接得到一个操作的SQL语句,而且在操作很多的情况下,容易混乱。(需要精确查看自己想看的sql)
2、EF Core的Where方法返回的是IQueryable类型, DbSet也实现了IQueryable接口。 IQueryable有扩展方法ToQueryString0可以获得SQL
3、不需要真的执行查询才获取SOL语句:只能获取查询操作的。

示例:
杨中科 EFCORE 第四部分 命令详解56-61_第55张图片
运行:
杨中科 EFCORE 第四部分 命令详解56-61_第56张图片
【总结】
写测试性代码,用简单日志; 正式需要记录SQL给审核人员或者排查故障,用标准日志;开发阶段,从繁杂的查询操作中立即看到SQL,用ToQueryString()。

你可能感兴趣的:(ASP.NET,.netcore,数据库,.net)