作为程序员, 在日常开发中, 记忆犹新的莫过于写代码, 升级程序. 升级程序包含两部分: 一是, 对服务程序更新; 二是, 对数据库结构更新. 本篇博文主要介绍数据库结构更新, 在对数据库升级时, 不知道园友们是否有如下经历:
1)脚本文件中建表语句未作判断是否存在, 而导致执行失败.
2)脚本文件中修改字段在建表语句之前, 关联存储过程执行顺序颠倒而导致执行失败.
3)各个历史脚本文件代码重复又重复, 如存储过程代码在多个脚本文件中存在.
4)新客户往往要执行多个脚本文件, 才能使用最新的产品.
可以说, 数据库升级是否能成功, 成了众多程序员特别是团队管理者的心病了. 接下来, 详细介绍使用 EF Core 实现数据库升级.
一. 使用 EF Core 命令方式进行迁移数据库
1. 程序包管理器控制台 (PMC) 迁移数据库
1)准备好实体(对应数据库表), 数据库操作类, 数据库连接字符串, 及数据库操作服务.
a. 学生实体类
- public class Student
- {
- public int ID { get; set; }
- public string FirstName { get; set; }
- public string LastName { get; set; }
- }
b. 数据库操作类
- public class SchoolDB:DbContext
- {
- public SchoolDB(DbContextOptions<SchoolDB> options) : base(options)
- { }
- public DbSet<Student> Students { get; set; }
- protected override void OnModelCreating(ModelBuilder modelBuilder) {
- modelBuilder.Entity<Student>().ToTable(nameof(Student));
- }
- }
c. 在 appsettings.JSON 中配置数据库连接字符串
- {
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
- }
- },
- "AllowedHosts": "*",
- "ConnectionStrings": {
- "SchoolDB": "Server=ERQFJF;Database=SchoolDB;User ID=sa;Password=******"
- }
- }
d. 在 Startup 中注入数据库操作服务
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddControllersWithViews();
- services.AddDbContext<SchoolDB>((options) => { options.UseSqlServer(Configuration.GetConnectionString("SchoolDB")); });
- }
e. 如下图: 是整个代码初始架构及数据库情况, 方便后续操作过程进行比较
2)打开 PMC, 如下图
3)接下来可以在 PMC 中输入相关命令来创建迭代版本, 升级数据库.
a. 使用 Add-Migration 命令创建迭代版本: 如下图
b. 使用 Update-Database 升级数据库: 如下图
升级数据库命令 Update-Database
升级后结果
4)当实体模型有更新时 (如新增实体, 新增实体属性, 修改实体属性等), 重复 2(使用 Add-Migration 创建迭代文件),3(使用 Update-Database 更新数据库) 步骤, 实现数据 库 (表) 与程序 (实体) 同步, 达成数据库升级.
2. 迭代文件说明, 如下图
3. 缺陷说明:
PMC 只能在 Visual Studio 下运行, 在生产环境下无法使用, 即无法在生产环境下使用 PMC 升级数据库.
或许有园友会说, 可以把其导出脚本放到数据库中执行, 这种方式只适合于首次使用产品的用户, 对于已经使用产品的用户, 则会存在以下问题:
1)导出的脚本不能直接使用, 如创建表, 新增字段等没有做任何判断, 需要修改相关脚本.
2)若有很多客户, 每个客户的升级的版本都不一致, 要逐个客户导出适用的脚本, 工作量巨大
3)有些客户的数据库服务器管理很严, 外部人员不能直连数据库操作
二. 自动升级数据库
1. 前面 2 个步骤, 与 PMC 一致
准备好实体(对应数据库表), 数据库操作类, 数据库连接字符串, 及数据库操作服务.
通过 Add-Migration 命令创建迭代文件
2. 通过 DatabaseFacade.Migrate 方法进行自动升级数据库, 代码如下图
三. 总结
1. 通篇介绍下来, 基本上是关于数据库升级. 那什么是数据库迁移: 其实就是数据库升级, 数据库架构更新.
2. 使用命令方式升级数据库, 除了 PMC, 还有 CLI, 其操作步骤相似, 只是命令不一样. 下表列出了两种方式的命令:
3. 使用 DatabaseFacade.Migrate()实现自动升级数据库.
来源: http://www.bubuko.com/infodetail-3297020.html