Migration——迁移

阮选
2023-12-01

准备

微软文档:迁移
本文概要:如何在独立项目管理迁移?常用的迁移命令有哪些?

安装控制台工具

在包含 DbContext 项目以及后面的迁移项目中

Install-Package Microsoft.EntityFrameworkCore.Tools -Version 6.0.1

创建迁移

在 包含 DbContext 的项目中新增文件**DbContextFactory

public class WPDbContextFactory : IDesignTimeDbContextFactory<WPDbContext>
{
    public WPDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<WPDbContext>();

        string connStr = "Data Source=127.0.0.1;Initial Catalog=WP;User ID=sa;Password=123456";
        optionsBuilder.UseSqlServer(connStr);

        return new WPDbContext(optionsBuilder.Options);
    }
}

**DbContextFactory必须实现IDesignTimeDbContextFactory<out TContext>接口,TContext必须是DbContext类型。
在程序包管理控制台中,选择要进行迁移的包含DbContext的项目,然后执行命令添加一个迁移:

PM>add-migration initProject

会在项目目录下生成迁移目录 Migrations,其中包含模型快照和刚添加的迁移

使用独立项目管理迁移

步骤参照微软官方文档

  1. 新建一个类库项目

    PM>Install-Package Microsoft.EntityFrameworkCore.Relational -Version 6.0.1
    
  2. 添加对 DbContext 项目的引用

  3. 将迁移和模型快照文件移动到类库(在原始包含 DbContext 的项目中,先生成一个迁移,然后把迁移和模型快照移动到迁移项目中)

    也就是说,第一次迁移必须是从 DbContext 项目中复制过来的(复制后,DbContext中的可以删除)

配置迁移项目

在上面**DbContextFactory项目中配置迁移项目:

public class WPDbContextFactory : IDesignTimeDbContextFactory<WPDbContext>
{
    public WPDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<WPDbContext>();

        string connStr = "Data Source=127.0.0.1;Initial Catalog=WorkingPlatform;User ID=sa;Password=123456";
        optionsBuilder.UseSqlServer(connStr, d => d.MigrationsAssembly("WP.Migrations"));  // 唯一的改动,指定迁移项目程序集名称

        return new WPDbContext(optionsBuilder.Options);
    }
}

配置完成,在程序包管理控制台中,选择迁移项目,执行update-database,正常情况下迁移已经更新到数据库中了。
到这里在单独项目中使用迁移就OK了,原始的 DbContext 项目再也没有乱七八糟的迁移相关代码了,整个人都清爽了!

上面实现方式是参照官网,但不完全一致,如果不明白,还是要看官方文档相关文档

常用迁移命令

上面已经演示过:add-migration [changeName]update-database,在看看其他命令。

add-migration

add-migration命令还可以指定参数-OutputDir,来给迁移脚本指定输出目录:

PM> add-migration price -outputdir Migrations_SqlServer

可以用来给不同数据库生成不同的脚本分目录。

update-database

不指定迁移版本,默认把最新迁移更新到数据库:

PM>update-database

指定迁移版本:

PM>update-database 20220407143303_init

把数据库迁移到指定的版本,可以是回退(Removing)迁移也可以是应用(Applying)迁移

注意:可能会造成数据丢失

remove-migration

删除最后一次的迁移脚本

script-migration

不指定版本,则默认生成最新迁移版本的(全部)SQL脚本。

PM>script-migration

可以指定两个版本参数:

PM>script-migration [source] [target]

生成 source 版本到 target 版本的SQL脚本

source 是源版本,target 是目标版本

如果不指定 target,则默认生成到最新版本的SQL脚本

反向工程

反向工程是指:根据数据库表反向来生成实体类以及DbContext。

PM>Scaffold-DbContext "Data Source=127.0.0.1;Initial Catalog=WP;User ID=sa;Password=123456"

利用反向工程生成的类都被标记为partial不建议修改反向工程生成的文件,可以利用部分类特性来调整配置。
生成的 DBContext 文件中默认 override 了OnModelCreating方法,不过默认调用了部分方法OnModelCreatingPartial,可以自己配置部分方法OnModelCreatingPartial

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Book>(entity =>
    {
        entity.HasComment("书籍表");
    });

    modelBuilder.Entity<SysSetting>(entity =>
    {
        entity.ToTable("Sys_Settings");
    });

    OnModelCreatingPartial(modelBuilder);
}

partial void OnModelCreatingPartial(ModelBuilder modelBuilder);

partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{ 
    // 自己配置,可以结合部分类放到单独文件中,避免直接修改反向工程生成的文件
}

反向工程生产的类,大部分情况下还需要自己调整(会挖坑),所以不建议在项目中使用反向工程

 类似资料: