杨中科 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…

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"…

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;目前已经有包括社交、金融、影音、游戏、资讯、…

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角色进行高情商…

[学习笔记]刘知远团队大模型技术与交叉应用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 种不同的摩天大楼和建筑物。• 其中每个…

【2023 我的编程之旅】

前言 转眼 2024 年都过去 14 天了。回顾 2023 有太多技术上的思考以及人生的感悟&#xff0c;接下来趁着 CSDN 官方活动&#xff0c;顺便记录下来。 技术的价值 与现在的年轻人一心只想搞钱不同&#xff0c;刚毕业的时候&#xff0c;我的梦想是进入一家有实力的科技企业&…

如何创建并格式化硬盘分区?

一般将新硬盘连接到计算机后&#xff0c;需先创建并格式化硬盘分区。否则在磁盘管理中会显示为“未分配空间”&#xff0c;并在文件资源管理器中不可见。那我们如何在硬盘上创建新分区&#xff0c;并对新分区进行格式化&#xff1f; 方法1. 通过命令提示符 首先&#xff0c;我…

两周掌握Vue3(三):全局组件、局部组件、Props

文章目录 一、全局组件1.创建全局组件2.在main.js中注册全局组件3.使用全局组件 二、局部组件1.创建局部组件2.在另一个组件中注册、使用局部组件 三、Props1.定义一个子组件2.定义一个父组件3.效果 代码仓库&#xff1a;跳转 本博客对应分支&#xff1a;03 一、全局组件 Vue…

计算机缺失mfu140u.dll的5种解决方法,亲测有效

在计算机系统运行过程中&#xff0c;mfu140u.dll文件的丢失是一个较为常见的问题场景。这个动态链接库文件(mfu140u.dll)对于系统的正常运行具有关键作用&#xff0c;它的缺失可能导致相关应用程序无法启动或执行功能异常。具体来说&#xff0c;mfu140u.dll丢失的场景可能出现在…

Arm LDM和STM的寻址方式

A32指令集中包含多数据传输指令LDM和STM&#xff0c;也就是单条指令可以传输多个寄存器的值与内存交互&#xff0c;这对于数据块传输以及寄存器的压入栈很有帮助。LDM和STM指令可分别用于实现堆栈的pop和push操作。对于堆栈操作&#xff0c;基寄存器通常是堆栈指针(SP)。 LDM和…

LeetCode讲解篇之2280. 表示一个折线图的最少线段数

文章目录 题目描述题解思路题解代码 题目描述 题解思路 折线图中如果连续的线段共线&#xff0c;那么我们可以可以将其合并成一条线段 首先将坐标点按照横坐标升序排序 然后遍历数组 我们可以通过计算前一个线段的斜率和当前线段的斜率来判断是否共线 如果二者相等&#x…

Python之字符串中常用的方法

1. 去掉空格和特殊符号 name " abcdefgeyameng " name1 name.strip() # 并不会在原来的字符串上操作,返回一个去除了两边空白的字符串 print(name1, len(name1), name, len(name)) # abcdefgeyameng 14 abcdefgeyameng 17 # 去掉左边的空格和换行符 name2 n…