ASP.NET Core 8.0学习笔记(二十七)——数据迁移:Migrations深入与其他迁移命令

一、数据库架构的管理

1.EF Core提供两种方式来保持EF Core的模型与数据库保持同步。

(1)以数据库为准:反向工程(Db First),适用于中大型工程

(2)以代码为准:数据迁移(Code First),适用于小型工程

2.关于Nuget包:Microsoft.EntityFrameworkCore.Design:常用于反向工程 Tools:数据迁移

3.迁移方式:

(1)当引入的数据模型更改时,添加迁移操作时,EF Core将当前模型与旧模型的快照进行比较,确定差异并生成迁移源文件

注意:主要是比较模型类与模型配置类(IEntityTypeConfiguration接口实现类以及DbContext类)修改前后的差异(修改前的代码保存在快照当中),然后生成对应的迁移脚本

(2)生成新的迁移后,迁移的记录将保存在Migration文件夹中。EF也将在数据库中记录所有的迁移变化

二、深入研究Migrations中的两个方法

1.获取Migrations脚本:新建实体类与配置类,以及DbContext,然后执行数据库迁移指令,观察生成的数据库脚本:

实体模型:

配置类:

数据库上下文类:

执行数据库迁移指令:

生成的Migration脚本如下:

2.引入概念:

(1)向上迁移、向下迁移:使用迁移脚本,可以对当前连接的数据库执行编号更高的迁移,这个操作叫做向上迁移(Up),也可以执行将数据库回退到旧的迁移,这个操作称为"向下迁移"。

(2)注:除非有特殊需要,否则不要删除Migrations文件夹下的代码(回退数据库版本使用)

3.代码分析:

(1)根目录下的文件

(2)Intial.cs的Up与Down方法:

Up:生成这张表或执行更新操作所需要的代码脚本

Down:回退当前操作所需要执行的代码

若在实体中添加一个属性Height,同样执行数据库迁移命令,生成的脚本如下:

注意,在生成的数据库中会有一张表,用于记录Migration记录,若随意删除则会报错。

4.但是Migration文件夹中的文件也不是一定不能删除。一般情况下只需要将生成的数据库整个删除以后,再删掉Migrations文件夹即可。此时重新运行Add-Migration命令以及update-database就不会出现任何问题。(因为快照等都被删除了,等于重新开始建库)

三、其他的Migration迁移指令

1.Update-Database XXX:将数据库回滚到XXX的状态,迁移脚本不动

将数据库回滚到Initial状态

2.删除最后一次的迁移脚本:Remove-Migration

3.Script-Migration:生成迁移Sql代码。Update-Database可以更新数据库,执行该命令可以生成SQL的更新脚本,手动更新数据库,有利于DBA对数据库进行管理以及恢复。

五、重置迁移

1.若需要重置所有迁移,但是又需要保留测试数据,可以按照以下方法操作:

(1)删除Migrations文件夹

(2)删除对应数据库中__EFMigrationsHistory表中的数据(不是删除表,只是清除数据)

(3)创建新的迁移并为其生成SQL脚本

(4)在数据库的迁移记录表(__EFMigrationsHistory)中插入一行,以记录刚才的迁移已经应用

2.示例:

(1)删除Migrations文件夹,重新执行Migration:

(2)删除数据库中的__EFMigrationHistory表中的数据

(3)将迁移的脚本所产生的数据直接插进迁移记录表中:(相当于手动执行update-database)

(4)修改一下代码,重新应用迁移:将People表的Name属性的最大长度由50改为64:

查看数据库:

且其他表的数据都没有受到影响。

相关推荐
wearegogog12312 分钟前
C# .NET 文件比较工具 WinForms
开发语言·c#·.net
糖不吃33 分钟前
WPF值转换器
c#
摇滚侠1 小时前
Spring 零基础入门到进阶 基于 XML 管理 Bean 14-28
xml·数据库·spring
Metaphor6921 小时前
使用 Python 给 PDF 设置背景色或背景图
数据库·python·pdf
Gauss松鼠会1 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结
睡不醒男孩0308231 小时前
第五篇:2026年企业级 PostgreSQL 高可用方案深度横评:Patroni vs. CLup 架构与可靠性全面对决
数据库·postgresql·架构
NineData1 小时前
SQL 都在等锁时,ChatDBA 先帮 MySQL 找到谁在挡路
数据库·人工智能·sql·mysql·安全·数据复制·数据迁移工具
超级无敌zhq1 小时前
后渗透痕迹清理:攻防对抗中的隐身术
网络·数据库·网络安全
2601_961845152 小时前
考研网课资源网盘|2027|资料
数据库·vim·sublime text·figma·photoshop·墨刀·高考
Amnesia0_02 小时前
MYSQL复合查询和内外连接
数据库·mysql