EF Core 使用 PMC 进行数据库迁移 Migration

正常来说我们都是使用 Code first的方式来使用Ef Core。 这样当我们的实体类发生变化的时候。我们就需要去修改数据库。这个手动生成修改的脚本。有时候还是比较麻烦的。 EF core 内置了一种机制让我们来更新数据库

第一步我们在 Data 项目下新建两个文件如下。

Student是一个实体类, MalemaDbContext是我们的dbcontext类。

    public class Student 
    {
        public int Id { get; set; }

        public string Name { get; set; }
    }

    public class MalemaDbContext : DbContext
    {
        public MalemaDbContext() : base()
        {
        }

        public MalemaDbContext(DbContextOptions<MalemaDbContext> options)
            : base(options)
        {
            this.Database.EnsureCreated();
        }

        public DbSet<Student> Students { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>().Property(x => x.Name).HasMaxLength(50);
            base.OnModelCreating(modelBuilder);
        }
    }

第二步 创建一个新项目叫做 MalemaMigration

(前面我们一直用的是Migration因为生成的migration文件跟 Migration会有命名上的冲突,所以这边我们改成了 MalemaMigration) 需要使用Nuget添加引用Microsoft.EntityFrameworkCore.Tools, 并且需要添加引用上面的data项目 (单独添加一个Migration项目,可以让我们的data项目更清晰) 接下来 添加一个文件

public class MigrationDbContext : MalemaDbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            //从环境变量里面读取连接字符串,在我们使用自动化部署(CD)的时候也是需要用 dotnet-ef来跑这个迁移程序的
            var db = Environment.GetEnvironmentVariable("dbconnection"); 
            if (string.IsNullOrEmpty(db))
            {
                //我们本地的数据库连接字符串
                db = "Data Source=127.0.0.1;Initial Catalog=MalemaEFCoreMigration;Persist Security Info=True;User Id=sa;Password=malema987%^&";
            }
            optionsBuilder.UseSqlServer(db);
            base.OnConfiguring(optionsBuilder);
        }
    }
}

可以用下面的git命令把代码签出到本地

git clone https://gitee.com/malema/Examples
git checkout migration/pmc_step_1

使用 Add-Migration 与 Update-database 初始化数据库

工具 -> NuGet 包管理器 -> 程序包管理器控制台 输入如下的命令

PM> Add-Migration Init
Build started...
Build succeeded.

如下图:

执行这个命令后,我们可以看到项目里面

这个时候数据库是还没有生成的。 接下来我们用如下的命令来生成数据库

PM> Update-database

如图

注意的是默认项目必须是 'MalemaMigration'. 还有MalemaMigration必须设成启动项目。

如果碰到错误 Build failed. 我们需要先编译一下我们的项目,解决方案。看看哪边有错。可以使用快捷键 Shit+Ctrl+B

执行完之后我们可以看到我们创建了一个新的数据库

可以用下面的git命令把代码签出到本地

git clone https://gitee.com/malema/Examples
git checkout migration/pmc_step_2

使用 Add-Migration 与 Update-database 更改数据库

我们会在Student里面新加一个新的属性

    public class Student 
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public DateTime? UpdatedOnUtc { get; set; }
    }

输入如下的命令

PM> add-migration AddUpdatedOnUtc
Build started...
Build succeeded.

它会生成一个新的文件 20210822101354_AddUpdatedOnUtc 并修改 MigrationDbContextModelSnapshot 同样的使用 update-database 就可以把这个新的变化更新到数据库了

PM> Update-database

注意: 团队其它人更新数据库只需要用 update-database就行了。不需要再次使用 Add-Migration 这个工具依赖于 __EFMigrationsHistory 这个表, 更新后的数据是存在这个表的。

生成数据库脚本

Script-Migration -From migrationName

如果没有添加-From参数的话,则生成所有的脚本

删除最近一个migration

如果add-migration之后还没有用update-database可以直接用 remove-migration 来删除migration

删除已经应用过的migration

使用 update-database migrationName 可以把数据库更新到某个版本。

Update-database init

上面的代码就可以把数据库恢复到 init的状态。 然后接下来就可以用 remove-migration 来删除最近Migration文件

最近更新的
...