如何使 EF 迁移工作为空并以现有数据库为起点?

How to make EF Migrations work empty AND existing database as starting point?

根据 Microsoft documentation,您有两个选项可以为 EF 中基于代码的迁移添加初始迁移:

  1. 使用现有数据库 (Add-Migration InitialCreate –IgnoreChanges)。 当将来要应用迁移的其他数据库与您的本地数据库当前具有相同的架构时,您应该使用这种方法。

  2. 使用空数据库 (Add-Migration InitialCreate)。 当将来要应用迁移的其他数据库为空(或尚不存在)时,您应该使用此方法。

我们正在尝试从自动迁移切换到基于代码的迁移,我们需要同时实现这两个选项,因为 (1.) 我们已经安装了一个应用程序并且 运行正在客户处安装,并且(2.) 我们想安装更多全新的应用程序。

我们怎样才能做到这一点?

我有两个关于如何实现这一点的想法,但不知道我可能 运行 遇到的副作用或麻烦。

旁注:我们使用现有的数据库方法 (1.) 成功迁移了已安装的应用程序,如 another post 中的示例。显然,全新安装不会那样工作。

如果您已经使用现有的数据库方法成功迁移了已安装的应用程序,那么该数据库将在 __MigrationHistory table 中有一个条目,其 migrationid 与文件名匹配初始迁移,并且您现在放置在 Up 方法中的任何代码都不会 运行。 不幸的是,您不能强制 re-scaffold 新应用程序的初始迁移,所以我会这样做:

  1. 删除 __Migrations table
  2. 中的条目
  3. 删除您的初始迁移
  4. Add-Migration InitialCreate 构建创建数据库所需的代码
  5. 注释掉Up方法中的代码,或者在顶部添加一个return以防止它执行。
  6. 将迁移应用到现有数据库。
  7. 取消注释 Up 方法中的代码,以便它为将来的新应用程序执行