【问题标题】:EF Code First with existing database on another databaseEF Code First 与另一个数据库上的现有数据库
【发布时间】:2018-03-05 20:23:03
【问题描述】:

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

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

  1. 我为现有数据库创建了一个空 InitialCreate
  2. 我做了一些其他的脚本,因为有一些变化,那些工作正常,脚本已创建并在数据库上运行

当我想使用这些脚本并迁移另一个尚未以这种方式初始化的数据库时,就会出现问题。我不知道该怎么办。

当我尝试运行 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.

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

【问题讨论】:

  • 您使用的 Db 可能缺少 _EFMIgrations 表?
  • 嗯,是的,确实如此。那就是问题所在。我如何创建它们?手动?我认为更新数据库会这样做吗?我将如何在生产中做到这一点?
  • 这将取决于之前应用的迁移以及您尝试应用的迁移。我只是猜测,这听起来像给你带来麻烦的 Db 丢失了针对其他数据库运行的所有或部分迁移。
  • 数据库 1 是我首先配置代码优先迁移的数据库,它是一个现有数据库。所以它也没有 __migrationtables。数据库 2 是另一个数据库,它也准备好首先在其中初始化代码(如生产数据库),它也没有 __migration 表,我不知道如何初始化它,更新数据库不起作用, 既不添加迁移
  • @JSteward 我不确定我是否清楚我的问题,我有一个 dabatase,它首先没有代码就开始了,然后首先添加了带有空首字母的代码。现在,我想先用代码转换另一个数据库,我只是无法用我拥有的脚本来完成

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


【解决方案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

【讨论】:

  • 感谢您的回答,自动迁移不是我的意思,我的意思是代码优先。我将使用您提出的选项进行一些测试。我是负责制作的人,所以我可以选择如何制作。你有什么推荐的?
  • 意见不一。我们有一个完整的 DBA 变更管理系统,所以我们必须使用脚本。这很痛苦,但他们处理所有的备份和恢复。我知道 Azure 部署也有运行迁移的选项。
  • 只是为了说明,我的配置中有一个错误导致迁移在项目中找不到迁移文件,这已得到纠正,所以现在我正在尝试实施一个适用于的解决方案所有数据库,但您的答案有效,所以我将其标记为好!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多