EF Code First与另一个数据库上的现有数据库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF Code First与另一个数据库上的现有数据库相关的知识,希望对你有一定的参考价值。
标题有点令人困惑,但我试图指出问题不是启动代码优先模型和现有数据库的迁移,而是在此之后。
我需要激活自动迁移,因为我们切换到了系统的代码优先模型。那么,这是做了什么:
- 我为现有数据库创建了一个空的InitialCreate
- 我做了一些其他脚本,因为有一些更改,那些工作正常,脚本是在数据库上创建和运行的
当我想使用这些脚本并迁移另一个尚未以这种方式初始化的数据库时,就会出现问题。我不知道该怎么办。
当我尝试运行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为空以及其他脚本这一事实。
好的,你有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。
以上是关于EF Code First与另一个数据库上的现有数据库的主要内容,如果未能解决你的问题,请参考以下文章
在 EF 6 和 MVC 5 中使用 Code First 方法将新表添加到现有数据库