EFCore ORM 数据库数据表迁移

背景

项目初期建表时,没有考虑到后续拓展性,错误地将描述 字段添加到了关系表 ,关系表应该只能存放关系。需要将描述 迁移到寄存器表中。

技术栈:EFCore ORM、SQLite3

概述

本文记录一下迁移的过程,有类似的需求以便参考。

本次迁移一共分为 5 步走:

  1. 目标表新增描述字段
  2. 迁移数据库表结构
  3. 编写、执行脚本复制描述字段数据
  4. 删除代码中原字段、修改对原字段的引用
  5. 检查无误后迁移数据表结构

目标表新增描述字段

目标表新增属性 Description

迁移数据库表结构

执行下面的命令

shell 复制代码
dotnet ef migrations add AddDescriptionToSpecialRegister
dotnet ef database update

现在迁移好的目标表中已有新的字段了。注意这里新的数据库文件位置取决于自己指定的数据库路径:

cs 复制代码
 	public class DataContext : DbContext
    {
        public DataContext()
        {
            string folder = AppDomain.CurrentDomain.BaseDirectory;
            string path = Path.Combine(folder, "data.db");
            DbPath = path;
        }
        protected override void OnConfiguring(DbContextOptionsBuilder options)
        {
            options.UseSqlite($"FileName={DbPath}");
        }
	}

我这里项目属性设置了始终复制源代码中的 data.db 到 bin 目录,所以每次数据库迁移完,要手动替换数据库文件。觉得麻烦就先关掉始终复制,所有迁移完成后再替换;或者开发/迁移阶段直接指定使用源代码中的数据库文件。

编写、执行脚本复制描述字段数据

cs 复制代码
class Program
{
    static void Main()
    {
        DataContext context = new DataContext();

        // 输出当前使用的数据库路径
        Console.WriteLine($"当前使用的数据库路径: {context.Database.GetConnectionString()}");
        using (var transaction = context.Database.BeginTransaction())
        {
            try
            {
                var descriptions = context.CpuSpecialRegisterAssociations.ToList();
                foreach (var d in descriptions)
                {
                    var description = d.Description;
                    var specialRegister = context.SpecialRegisters.First(x => x.Id == d.SpecialRegisterId);
                    specialRegister.Description = description;
                }

                context.SaveChanges();
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                Console.WriteLine($"迁移过程中出错: {ex.Message}");
                Console.WriteLine(ex.StackTrace);
            }
        }
    }
}

删除代码中原字段、修改对原字段的引用

删除原表中的描述属性。这时候直接执行dotnet ef migrations add xxxx会编译不通过,因为很多地方用了这个描述属性,而它被删除了。

修改之前引用这个属性的代码。修改完成后,可以使用 dotnet build检查一下编译是否通过。

如果编译通过了,就可以进行下一步。

检查无误后迁移数据表结构

执行以下命令

shell 复制代码
dotnet ef migrations add RemoveDescriptionInCpuSpecialRegisterAssociation
dotnet ef database update

执行完毕后,数据库中关系表中的描述字段就被删掉了。

总结

自此完成了数据库两表之间的数据迁移。可根据自己的情况进行数据库文件的替换(若数据库源文件与修改的文件不是相同的)

相关推荐
NocoBase16 分钟前
【2.0 教程】第 1 章:认识 NocoBase ,5 分钟跑起来
数据库·人工智能·开源·github·无代码
颜酱1 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
Hoshino.412 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
小码哥_常2 小时前
Java后端定时任务抉择:@Scheduled、Quartz、XXL - Job终极对决
后端
uzong2 小时前
Skill 被广泛应用,到底什么是 Skill,今天详细介绍一下
人工智能·后端·面试
小码哥_常3 小时前
Kafka平替!SpringBoot+Redis Stream+消费组打造极致消息队列
后端
Oueii3 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
未来龙皇小蓝4 小时前
【MySQL-索引调优】11:Group by相关概念
数据库·mysql·性能优化
2401_831824964 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
njidf4 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python