EF Code First与另一个数据库上的现有数据库

时间:2018-03-05 20:23:04

标签: c# entity-framework-6 ef-migrations

标题有点令人困惑,但我试图指出问题不是为现有数据库启动代码优先模型和迁移,而是在此之后。

我需要激活自动迁移,因为我们切换到系统的代码优先模型。所以,这就是做了什么:

  1. 我为现有数据库创建了一个空的InitialCreate
  2. 我做了一些其他脚本,因为有一些更改,那些工作正常,脚本已创建并在数据库上运行
  3. 当我想使用这些脚本并迁移另一个尚未以这种方式初始化的数据库时,会出现问题。我不知道该怎么办。

    当我尝试运行Update-database时,我收到错误:

    Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.
    You can use the Add-Migration command to write the pending model changes to a code-based migration.
    

    如果我执行Add-Migration,它会再次创建一个包含所有内容的迁移,所有创建表,就像它忽略了我的当前脚本,有一个InitialCreate空和其他脚本的事实。

1 个答案:

答案 0 :(得分:1)

好的,你有2个数据库 - 让我们说DEV和PROD。两者都处于相同的状态,并且在启用迁移之前具有相同的模式。这是做什么的:

1 - 将迁移添加到DEV环境并将数据库初始化程序设置为MigrateDatabaseToLatestVersion。另一个选择是programatically run migrations

enable-migrations
// take a snapshot of current state. -IgnoreChanges prevents recreate of existing objects.
add-migration InitialBaseline -IgnoreChanges
update-database

2 - 有几种方法可以使其他数据库保持同步:

A)通过更改连接字符串来并行维护迁移。所以指向PROD,并运行update-database来创建__MigrationHistory表并应用初始的空白基线。我不建议PROD数据库使用此选项(见下文)。

B)与脚本同步。许多组织不希望EF应用更改,而是要求DBA应用脚本。对于此选项,您可能希望将数据库初始化程序设置为NULL。在这种情况下,您可以执行update-database -Script生成更改。这将在您的初始基线之后的迁移中完成,因为它们已经同步。有关此技术的详细信息,请参阅here

C)使用数据库项目或差异工具来保持同步。

现在,当您在DEV中更改模型时:

add-migration Changes1
update-database

对于选项A,更改连接字符串并重复。对于选项B,请使用update-database -Script。对于选项C,使用工具重新同步。

注意:"我需要激活自动迁移......" - 自动迁移是一个完全不同的问题,可能会使过程复杂化。请参阅here