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

时间:2018-03-18 08:43:42

标签: c# entity-framework ef-migrations

根据Microsoft documentation,您有两种方法可以在EF中为基于代码的迁移添加初始迁移:

  1. 使用exinsting数据库(Add-Migration InitialCreate –IgnoreChanges)。 如果将来应用迁移的其他数据库与本地数据库当前具有相同的模式,则应使用此方法。

  2. 使用空数据库(Add-Migration InitialCreate)。 如果将来应用迁移的其他数据库为空(或者尚不存在),则应使用此方法。

  3. 我们正在尝试将表单自动迁移切换到基于代码的迁移,我们需要让两个选项都发生,因为(1.)我们已经安装了一个应用程序并在客户位置运行,并且(2.)我们想要安装更多应用程序。

    我们如何实现这一目标?

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

    • 使用空数据库方法(2.)并手动将代码添加到Up()检查是否已存在表和字段以跳过现有迁移。
    • 使用空数据库方法(2.)并将__MigrationHistory表的条目手动复制到我们客户的数据库中,以假装它们“已经迁移”。

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

1 个答案:

答案 0 :(得分:1)

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

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