Entity Framework Core SQLite provider 向已存在的表中添加外键

507 字
3 分钟
...阅读
...评论

SQLite 本身不支持向已创建的表中添加外键,类似的限制还有很多,比较蛋疼,具体可以参见SQLite Limitations

项目中,如果是测试的时候,数据不是很重要的话,最方便的方法就是把已经创建的 Migrations 包括 ModelSnapshot 都删掉,重新 Add-Migration 重建数据库。

对于已经发布的应用,数据库不能删了创建的话,可以“曲线救国”。

假设需要给 TableA 添加一个需要建立外键的字段 ColumnA,为了增加难度,假设 TableB 中的 Column

B 是 TableA 的外键。具体操作方法如下:

  1. 先在代码中 TableA 里添加 ColumnA(不设置外键),Add-Migration,更新到线上数据库
  2. 将本地的数据库改名为 database-backup,删除项目中所有 Migrations 和 ModelSnapshot,创建一个 RebuildDatabase 的 Migration,创建全新的数据库,从新数据库中复制 TableA 的 Create Statement SQL 语句并将改 SQL 语句中的表名改为 TableA-New
  3. 在线上数据库中执行步骤 2 中的 SQL 语句,将创建 TableA-New(已经含有外键约束了)
  4. 导出线上数据库中 TableA 中的数据到 SQL 文件中,并将该 SQL 文件中的表名改为 TableA-New
  5. 将步骤 4 中的 SQL 文件的数据导入到线上数据库中
  6. 将线上数据库的 TableA 改名为 TableA-Old,将 TableA-New 改名为 TableA
  7. 因为重命名的关系,这时候 TableB 中的 ColumnB 是 TableA-Old 的外键,通过如下方法,将 TableB 中的外键约束改到 TableA 中:复制 TableB 的 Create Statement,创建一个 TableB-New,其中的 ColumnB 是 TableA 的外键,然后将 TableB 改名为 TableB-Old,并将 TableB-New 改名为 TableB(如果还有 TableC 中有 TableB-Old 的外键,通过同样的方法操作,以此类推),删除 TableB-Old。(如果没有这样的 TableB,则此步骤省略)
  8. 删除 TableAOld
  9. 清空线上数据库__EFMigrationHistory 表中的数据,并手动添加一条数据,以 RebuildDatabase 的 Migration 的文件名作为 MigrationId,并输入当前的 ProductVersion

收工!

评论区
Copyright © Bean Deng