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

news/2025/2/24 9:07:19

一、数据库架构的管理

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:
在这里插入图片描述

查看数据库
在这里插入图片描述

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


http://www.niftyadmin.cn/n/5864148.html

相关文章

《论基于构件的软件开发方法及其应用》审题技巧 - 系统架构设计师

软考论文写作框架:基于构件的软件开发方法及其应用 一、考点概述 本论题“基于构件的软件开发方法及其应用”主要考察的是软件工程专业中关于基于构件开发(CBSD)的深入理解与实践应用。考点涵盖以下几个方面: 首先,…

逻辑函数的神经网络实现

1.单层感知器实现基本逻辑函数 先给大家抛出一道例题 (一)种类 a.OR函数 目标:当至少一个输入为1时,输出1;否则输出0。 权重设置: 输入权重:所有 wi1(i1,2,...,m)。…

C++ 类和对象(友元、内部类、匿名对像)

目录 一、前言 二、正文 1.友元 1.1友元函数的使用 1.1.1外部友元函数可访问类的私有成员,友员函数仅仅是一种声明,他不是类的成员函数。 1.1.2一个函数可以是多个类的友元函数 2.友元类的使用 2.1什么是友元类 2.2 友元类的关系是单向的&#x…

Distilabel 入门指南:基本概念、安装与快速上手

系列文章: Distilabel 入门指南:基本概念、安装与快速上手 Distilabel 基础指南:概念与入门 Distilabel 高级指南:深度功能与最佳实践 Distilabel API 文档:功能详解与使用 正文: 概述 Distilabel 是…

掌握 ElasticSearch 组合查询:Bool Query 详解与实践

掌握 ElasticSearch 组合查询:Bool Query 详解与实践 一、引言 (Introduction)二、Bool 查询基础2.1 什么是 Bool 查询?2.2 Bool 查询的四种子句2.3 语法结构 三、Bool 查询的四种子句详解与示例3.1 must 子句3.2 filter 子句3.3 should 子句3.4 must_no…

QQ登录测试用例报告

QQ登录测试用例思维导图 一、安全性测试用例 1. 加密传输与存储验证 测试场景:输入账号密码并提交登录请求。预期结果:账号密码通过加密传输(如HTTPS)与存储(如哈希加盐),无明文暴露。 2. 二…

【springcloud】快速搭建一套分布式服务springcloudalibaba(一)

第一篇 基于nacos搭建一套springcloud分布式服务 项目所需 maven nacos java8 idea git 当前项目为快速搭建 用户服务提供查询,商品服务查询用户信息 请先准备好环境,可以直接clone下来项目去部署。 快速搭建一套分布式服务 项目结构关于搭建下载配置…

驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线

一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…