如何将 EF 迁移引入现有的成熟项目

How to introduce EF-migrations into existing mature project

简而言之,我想做的是将迁移的力量添加到成熟的项目中,并且始终使用 sql 手动处理更改。

我被分配了一个使用 Entity Framework 的项目,但所有数据库更改都是手动完成的,没有使用迁移。

早些时候引入新的更改时,我们会在代码中创建模型,使用新表更新上下文,然后使用 Entity Framework PowerTools 生成 sql,然后手动更新数据库。

所以今天我们有一个完整的数据库,我们有一个databasecontext,还有精心制作的EntityTypeConfiguration 类。所以这是代码优先的情况,但是数据库已经存在了。

挑战在于我 运行

'Enable-Migrations'
'Add-Migration'

我被一个完整的 Up() 函数困住了,如果我这样做的话,它会尝试创建整个数据库

'Update-Database'.

我想我想做的是在数据库中设置一个标志,表明当前状态是现状,并且我当前的 Up() 函数只会在创建全新数据库时使用。

之后,我希望所有对数据库的更改都由 EF 迁移处理。

这可能吗?以及如何?

提前致谢

选项 1:创建从当前模型开始的迁移

您可以在 Add-Migration 命令中使用 –IgnoreChanges 参数:

Add-Migration MigrationName –IgnoreChanges

这会创建一个空迁移,将当前模型作为快照。

选项 2:创建从头开始创建数据库的完整迁移,但跳过某些数据库的第一次迁移

Entity Framework 使用 __MigrationHistory table 来跟踪已经执行的迁移。在数据库上执行第一次迁移时,它被插入 __MigrationHistory table。下次调用 Update-Database 命令时,EF 查看 __MigrationHistory table 并跳过已应用于数据库的迁移。

要使特定数据库跳过第一次迁移,您可以执行以下操作:

  1. 创建初始迁移:
Enable-Migrations
Add-Migration InitialCreate 
  1. 获取迁移脚本,使用以下命令:
Update-Database -Script
  1. 删除上述脚本中的所有内容,但以下语句除外:
CREATE TABLE [__MigrationHistory]
INSERT INTO [__MigrationHistory] ...

并在数据库上执行这些语句。

现在此数据库具有已应用 InitialCreate 迁移的信息,并且针对此特定数据库进一步调用 Update-Database 将跳过 InitialCreate 迁移。