EF Core 实战教程(五)Migrations深入研究及使用详解
小白浏览:5252022-09-17 11:30:27本文累计收益:0我也要赚钱

Migrations迁移脚本用于EF Core中使用Code First方式创建以及修改数据库操作。首次创建数据库后,后期也可以使用Migrations对数据库进行变更操作(如修改表结构、增加、删除表)。使用Migrations迁移脚本,可以对当前连接的数据库执行编号更高的迁移,这个操作叫做“向上迁移”(Up),也可以执行把数据库回退到旧的迁移,这个操作叫“向下迁移”(Down)。

首次使用Migrations创建数据库后,会在程序中生成Migrations文件夹,文件夹下面存放的是Migrations创建数据库运行代码,除非有特殊的需要,否则不要删除Migrations文件夹下的代码。同时会在数据库中生成__EFMigrationsHistory数据表,记录数据库创建更新记录。

一、首次创建数据库

创建数据库第一步必须先写EF Core相关程序《具体方法见:EF Core 实战教程(一)配置环境及使用code first 创建数据库》,主要包含实体类、实体类与数据库表格映射配置类以及DbContext上下文类三个类。

在程序包管理器控制台执行以下两条命令创建数据库。

PM>Add-Migration init

PM>Update-database

数据库创建完成后会在项目中生成Migrations文件夹,Migrations文件夹下是一些按照一定编号生成的每次更新数据库的执行脚本代码。

如下图:

以下代码是以Person实体类(只包含Id及Name属性)为例创建的数据库生成的Migrations创建脚本代码:

public partial class init : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Persons",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    Name = table.Column<string>(type: "nvarchar(max)", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Persons", x => x.Id);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Persons");
        }
    }

Person实体类代码:

 

public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

从以上代码可以看出,主要包含Up及Down两个方法,Up方法主要是创建数据表Persons的代码,而Down则是记录删除Persons的代码,Down代码主要就是给以后回退使用。

二、修改Persons表结构,增加列

首先在Person实体类增加Height身高字段,代码如下:

public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Height { get; set; }
}

然后在程序包管理器控制台执行以下两条命令修改数据库。

 

PM>Add-Migration add-height

 

PM>Update-database

执行成功后在Migrations文件夹下面又增加了一个类,如下图:

20220917024056_add-height类代码如下:

public partial class addheight : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<int>(
                name: "Height",
                table: "Persons",
                type: "int",
                nullable: false,
                defaultValue: 0);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "Height",
                table: "Persons");
        }
}

从上的代码可以看出,还是包含Up及Down两个方法,Up是增加Height列的代码,Dwon是删除Height列的代码,用于以后回退本次对数据库的修改。

 

此时数据库__EFMigrationsHistory表数据如下:

 

三、Migrations回退操作

回滚命令格式如下:Update-Database 回滚版本号。

如要删除上一步增加的height列,执行回滚到数据库创建的那一步即可,Update-Database 20220917020010_init命令就可以将数据库回滚到初始创建的状态,因为程序并没有删除增加height列的20220917024056_add-height代码文件,再次执行Update-Database命令,会在增加Height列。

说明:如果删除数据库中的数据库,执行Update-database+“回滚类文件名”命令,程序会创建数据库到“回滚类文件名”的状态,进行灵活的操作。

四、Migrations其他操作命令

1、Update-Database XXX

把数据库升级或回滚到XXX的状态,迁移脚本不动。

2、Remove-migration

删除最后一次的迁移脚本,删除之前必须保证迁移脚本没执行到数据库的操作,如果执行需要回滚一下。

3、Script-Migration

生成迁移Sql代码,也就是操作数据库的sql脚本。可以使用Script-Migration A B生成中间版本的sql脚本。

五、特别说明

以上方式只适合开发数据库的更新,不适合生产数据库(正式数据库)的更新,可以使用Script-Migration生成的脚本更新生产数据库。

 

微信扫一扫,欢迎进群交流:

评论列表
发表评论
+ 关注