[WPF] 基于EF Core如何实现数据库自动升级

126 阅读2分钟

为建立中文知识库加块砖        ——中科大胡不归

背景描述

EF Core是微软出的数据库框架。遇到的实际问题是:软件已经发布,有数据库和数据。新版本更改了数据库的表的结构,在软件更新后,程序启动时实现对数据库的升级并保留数据。

本文主要说明如何基于EF Core实现数据库自动升级。

解决办法

Sqlite数据库为例,使用Rider作为IDE。

0 预置条件

0.1 Nuget

透过Nuget安装Microsoft.EntityFrameworkCore.Sqlite和Microsoft.EntityFrameworkCore.Tools两个库。

0.2 Rider插件

Rider打开插件市场,安装Entity Framework Core UI,这个插件平替实现Visual Studio的NuGet包管理器控制台的功能。Microsoft.EntityFrameworkCore.Tools中:

  • Add-Migration 将基于自上次迁移创建以来对模型所做的更改来构建下一次迁移
  • Remove-Migration
  • Update-Database 将对数据库应用任意挂起的迁移
  • Drop-Database
  • ...

1 最终材料清单

  • Migrations目录
  • 表__EFMigrationsHistory
  • .db数据库文件

最终材料清单

1.1 Migrations目录

首次使用工具Rider->Tools->Entity Framework Core->Add Migration将在工程里面生成Migrations目录,向Migrations目录下的项目添加以下三个文件:

  • XXXXXXXXXXXXXX_AddCreatedTimestamp.cs - 主迁移文件。 包含应用迁移所需的操作(在 Up 中)和还原迁移所需的操作(在 Down 中)。
  • XXXXXXXXXXXXXX_AddCreatedTimestamp.Designer.cs - 迁移元数据文件。 包含 EF 所用的信息。
  • MyContextModelSnapshot.cs--当前模型的快照。 用于确定添加下一迁移时的更改内容。

1.2 表__EFMigrationsHistory

首次使用工具Rider->Tools->Entity Framework Core->Update Database将在数据库文件增加一张记录迁移历史的表:__EFMigrationsHistory。

1.2 表__EFMigrationsHistory

1.3 .db数据库文件

基于以上操作生成的.db数据库文件才具备自动迁移的前提。当在App.xaml.cs添加如下代码:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    using var dbContext = new IaContext();
    // 检查数据模型是否发生了变化
    if (dbContext.Database.GetPendingMigrations().Any())
    {
        // 应用未应用的迁移
        dbContext.Database.Migrate();
    }
}

会在程序启动时完成数据库升级。

2 升级完成

当升级完成,数据中的数据记录将和Migrations中的迁移脚本的数量一致。未更新的数据库文件的迁移历史缺少最新一条。