为建立中文知识库加块砖 ——中科大胡不归
背景描述
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.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中的迁移脚本的数量一致。未更新的数据库文件的迁移历史缺少最新一条。