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

Migrations

深入研究Migrations

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

示例:
程序结构

Person 类

在这里插入图片描述

PersonConfig

在这里插入图片描述

MyDbContext

在这里插入图片描述
在这里插入图片描述

主程序类
在这里插入图片描述

运行:
在这里插入图片描述

此时查看 Migrations下生成的文件
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

此时若是增加一列
在这里插入图片描述

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

在这里插入图片描述

此时,Migrations文件中,新增了一个脚本 up方法中的内容也发生了改变,是增加一列
(文件前面的编号内容也在增大)
在这里插入图片描述

此时的向下迁移 down 方法
则是删除该列
在这里插入图片描述

执行 Update-Database

在这里插入图片描述

查看数据库内容

在这里插入图片描述

查看EFMigrationsHistory

在这里插入图片描述
ProductVersion : EFCORE 版本
MigrationsId : 显示数据库都执行了哪些脚本

这个表 是由EFCORE 维护

若估计删除表中一行记录
在这里插入图片描述
然后执行update-database
在这里插入图片描述
出现报错信息
在这里插入图片描述

列重复。

数据库其他迁移命令

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

示例:
删除数据库
在这里插入图片描述

执行 Update-Database
在这里插入图片描述

此时数据直接到 AddHeight 版本
在这里插入图片描述
使用 Update-Database xx 尝试还原到上一个版本
在这里插入图片描述

刷新数据库,发现还原成功
在这里插入图片描述

表中记录也减少一条
在这里插入图片描述

再次 执行 删除数据库操作。
此时需要达到 只执行到Init 状态,不执行到 add height
在这里插入图片描述
测试成功
在这里插入图片描述

Remove-migration

为了防止不小心 删除了 破环了前后关系,最好不要手动删除迁移脚本
而是使用 Removing 命令 删除最近一次记录
在这里插入图片描述

Script-Migration

在这里插入图片描述

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

在这里插入图片描述
这样的目的 是在项目上线后,修改数据时,能更直观的看到如何修改得数据库 ,防止不小心的操作破坏生产环境

生成中间版本 到某个版本的迁移脚本
在这里插入图片描述
sql脚本
在这里插入图片描述
再把该代码 复制到数据库中运行
在这里插入图片描述

结果:

在这里插入图片描述

Script-Migration D 生成某个版本到最新版本的数据迁移记录
在这里插入图片描述

EFCORE 反向工程

反向工程

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

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

示例:
新建数据库
在这里插入图片描述

新建表
在这里插入图片描述
命令输入执行
在这里插入图片描述
此时项目中自动生成了 Dbcontext 和 Person 类
在这里插入图片描述
在这里插入图片描述

注意

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

FECORE 底层如何操作数据库

Know How

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

在这里插入图片描述

EFCORE 底层就是靠 ADO.NETCORE来操作的
在这里插入图片描述

原理:

在这里插入图片描述

查看生成的SQL语句

1、SOL Server Profiler(收费版才有)查看SOLServer数据库当前执行的SQL语句。
在这里插入图片描述
查询窗口执行过的sql 语句 在SQL Server Perfiler 就能监控到
在这里插入图片描述

在这里插入图片描述
代码方式

在这里插入图片描述
在这里插入图片描述

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("张");
}

示例:
在这里插入图片描述
在这里插入图片描述
语句成功被翻译成为sql
在这里插入图片描述
修改代码
完全可以编译通过的合法sql 语句
在这里插入图片描述
报错,该Linq 表达式 无法被翻译为sql
在这里插入图片描述
sqlseverprofiler中也没有记录
在这里插入图片描述

在这里插入图片描述

通过代码查看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
在这里插入图片描述
在这里插入图片描述
编写代码
在这里插入图片描述
在这里插入图片描述
运行:
在这里插入图片描述

方法2:简单日志

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

示例:
在这里插入图片描述

运行结果:

在这里插入图片描述
只输出跟sql语句相关的东西
在这里插入图片描述
运行结果:
在这里插入图片描述

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

方法3: TOQUERYSTRING

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

示例:
在这里插入图片描述
运行:
在这里插入图片描述
【总结】
写测试性代码,用简单日志; 正式需要记录SQL给审核人员或者排查故障,用标准日志;开发阶段,从繁杂的查询操作中立即看到SQL,用ToQueryString()。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人行业概况(2)

上篇已经介绍过关于机器人的定义以及分类,下面来看看机器人产业市场规模。 二、国内机器人产业市场规模 中国机器人产业在国家智能制造相关政策的引导下蓬勃发展。在新冠肺炎疫情防控期间,消毒、配送、测温、巡检等各类机器人的“火线上岗”&#xff0…

javascript:javascript去除字符串空格(空白符)

使用js去除字符串内所带有空格,有以下三种方法: 1 replace正则匹配方法 去除字符串内所有的空格 str str.replace(/\s*/g,""); 去除字符串内两头的空格 str str.replace(/^\s*|\s*$/g,""); 去除字符串内左侧的空格 str st…

spring-boot2.7.8添加swagger

一、新建项目swaggerdemo 二、修改pom.xml 注意修改&#xff1a;spring-boot-starter-parent版本为&#xff1a;2.7.8 添加依赖&#xff1a; springfox-swagger2 springfox-swagger-ui springfox-boot-starter <?xml version"1.0" encoding"UTF-8"…

C++日志库——spdlog

介绍 https://github.com/gabime/spdlog.git spdlog is a header only library. Just copy the files under include to your build tree and use a C11 compiler. spdlog是一个仅有头文件的库&#xff0c;只需要拷贝include下面的文件加到本地工程目录并使用支持C11的编译器编…

【打卡】牛客网:BM86 大数加法

题目分析&#xff1a; 因为是大数&#xff0c;所以不能&#xff1a;将string转为int&#xff0c;进行相加后&#xff0c;再int转为string。 而是直接模拟加法过程。 我写的&#xff1a; 一些细节&#xff1a; 需要反转。因为字符串从左到右遍历&#xff0c;加法从右往左遍…

QT第3天

如上图界面&#xff0c;需求如下&#xff1a; 1、根据名字添加水果&#xff0c;并设置好单价 2、切换文件查看模式 3、点击任意水果可以显示单价 4、重量改变时&#xff0c;总价自动显示 //widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <Q…

RH850P1X芯片学习笔记-Flash Memory

文章目录 FeaturesClock Supply Block DiagramFlash SizeMemory ConfigurationRegistersRegister Base AddressList of RegistersRegister Reset Condition 与Flash Memory相关的操作模式Functional OverviewOption BytesOPBT0 — Option Byte 0OPBT1 — Option Byte 1OPBT2 —…

【CSS】保持元素宽高比

保持元素的宽高比&#xff0c;在视频或图片展示类页面是一个重要功能。 本文介绍其常规的实现方法。 实现效果 当浏览器视口发生变化时&#xff0c;元素的尺寸随之变化&#xff0c;且宽高比不变。 代码实现 我们用最简单的元素结构来演示&#xff0c;实现宽高比为4&#xf…

鸿蒙Harmony是如何影响Android工程师的呢?

其实鸿蒙在2019就已经出来了&#xff0c;那时候还是套壳Android的。从2023年9月的发布会上&#xff0c;华为宣布鸿蒙原生应用全面启动、HarmonyOS NEXT亮相以后&#xff0c;围绕着纯血鸿蒙展开的鸿蒙应用生态发展迅猛&#xff0c;目前已经有包括社交、金融、影音、游戏、资讯、…

【Java万花筒】时钟精灵:Java日期库全景剖析

时间漫步者&#xff1a;深入Java时间库实战 前言 在现代软件开发中&#xff0c;处理日期与时间是一个常见而又具有挑战性的任务。Java为我们提供了强大的日期与时间处理库&#xff0c;这些库不仅使日期与时间的操作更加方便&#xff0c;而且满足了各种复杂的需求。本文将深入…

docker-compose和docker compose的区别

在docker实际使用中&#xff0c;经常会搭配Compose&#xff0c;用来定义和运行多个 Docker 容器。使用时会发现&#xff0c;有时候的指令是docker-compose&#xff0c;有时候是docker compose&#xff0c;下面给出解释。 docker官方文档&#xff1a;https://docs.docker.com/c…

ArrayBlockingQueue的使用

异步日志打印模型概述 在高并发、高流量并且响应时间要求比较小的系统中同步打印日志已经满足不了需求了&#xff0c;这是因为打印日志本身是需要写磁盘的&#xff0c;写磁盘的操作会暂时阻塞调用打印日志的业务线程&#xff0c;这会造成调用线程的rt增加。 如图所示为同步日…

WorkPlus领先企业即时通信软件,提升团队沟通效率的利器

在企业工作中&#xff0c;高效沟通是推动团队协作和工作效率的关键。而企业即时通信软件成为了实现高效沟通的利器。作为一款领先的企业即时通信软件&#xff0c;WorkPlus以其卓越的性能和独特的功能&#xff0c;提升团队沟通效率&#xff0c;助力企业实现高效协作。 为什么选择…

豆包ai介绍

豆包是字节跳动基于云雀模型开发的AI工具&#xff0c;具有强大的语言处理能力和广泛的应用场景&#xff0c;无论是在学习、工作、生活中&#xff0c;都能派上用场。 豆包可以帮助打工人和创作者提升效率&#xff0c;完成各种工作任务&#xff0c;又能扮演各类AI角色进行高情商…

win10安装electron卡住

切换镜像源&#xff0c;需要设置ELECTRON_MIRROR才行&#xff0c;win10操作如下&#xff1a; set ELECTRON_MIRRORhttp://npm.taobao.org/mirrors/electron/ npm install --save-dev electron

C++右值引用,右值引用与const引用的区别

1.右值与左值 左值&#xff1a;可以取地址的、有名字的变量&#xff0c;有持久性&#xff1b;右值&#xff1a;一般是不可寻址的常量&#xff0c;或在表达式求值过程中创建的无名临时对象&#xff0c;短暂性的。 2.右值引用 C11新增了另一种引用——右值引用。这种引用可指向…

[学习笔记]刘知远团队大模型技术与交叉应用L1-NLPBig Model Basics

本节主要介绍NLP和大模型的基础知识。提及了词表示如何从one-hot发展到Word Embedding。语言模型如何从N-gram发展成预训练语言模型PLMs。然后介绍了大模型在NLP任务上的表现&#xff0c;以及它遵循的基本范式。最后介绍了本课程需要用到的编程环境和GPU服务器。 一篇NLP方向的…

从零开始做题:逆向wdb_2018_2nd_easyfmt

1.题目信息 2.解题分析 格式化字符串漏洞 如何确定偏移 Do you know repeater? 输入AAAA.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p. 输出AAAA.0xffffd658.0x64.0xf7ffdc08.0xf7ffcd00.0xffffd77c.0x41414141.0x2e70252e.0x252e7025.0x70252e70.0x2e70252e.0x252e7025.0x70252…

City Terrace Pack

“城市与露台资源包” 的主要特点:• 属于系列的一部分。• 极为逼真和现代化的城市。• 高度优化的低多边形和逼真资源。• 可用于 Oculus、GearVR、Vive、Daydream。• 可用于低端和高端移动设备。• 灵感来自于现代建筑和设计。• 36 种不同的摩天大楼和建筑物。• 其中每个…

【Windows 10 / 11】彻底卸载Microsoft Edge

彻底卸载Microsoft Edge的方法 第一种 打开C盘&#xff0c;定位到Edge安装目录&#xff0c;一般是“C:\Program Files (x86)\Microsoft\Edge\Application\”进入对应当前Edge版本号的文件夹&#xff0c;并进入“Installer”文件夹内找到“setup.exe”按下“shift”键并点击鼠标…