如何管理开发和生产数据库之间的EF迁移?

时间:2014-02-25 15:49:32

标签: entity-framework ef-code-first database-migration ef-migrations

在任何人将此标记为重复之前,没有任何与此类似的问题解决了我的任何疑虑或回答了我的任何问题。

我目前正在开发库项目中的所有POCO和数据上下文,并在此项目中运行迁移。我正在更新的数据库是开发数据库。

如果我想将当前架构创建到新的新数据库,该怎么办?我认为我所要做的就是更改web.config中的连接字符串并运行Update-Database,对吗?

当live / production数据库启动并运行时,我想在架构中添加新列和新表,并在开发中测试它。所以我将连接字符串切换回开发数据库的连接字符串,然后运行Update-Database。

在两个数据库之间来回看起来好像我会在_MigrationHistory表和自动生成的迁移脚本之间发生冲突。

手动删除两个数据库中的_MigrationHistory表和/或删除/ Migrations中的迁移文件是否安全(因此我将再次运行Add-Migration)?我们如何管理这个?

4 个答案:

答案 0 :(得分:2)

如果我想将当前架构创建到新的新数据库,该怎么办?   - 是的,要创建到当前迁移级别的新数据库,只需修改连接字符串以指向尚不存在的数据库并运行update-database。它将按顺序运行所有迁移。

就迁移到Production数据库而言,我正在运行带有-script开关的update-database命令以获取原始sql,然后手动将该脚本应用于生产数据库。如果您需要保留对数据库运行的sql命令的记录,这将非常有用。此外,您可以通过某些其他更新数据库开关从特定迁移到另一个特定迁移显式生成脚本。

或者,您可以使用–SourceMigration $InitialDatabase开关创建一个适用于任何迁移的Idempotent脚本,并可选择使用–TargetMigration指定结束迁移

如果删除_MigrationHistory表,则会遇到生成的脚本尝试添加已存在的列等问题。

您可能会发现以下链接有用:
Microsoft Entity Framework Migrations

答案 1 :(得分:0)

我建议你的源代码库中有一个单独的主干 - 一个指向生产,一个指向开发,以避免在visual studio中切换两者之间的风险。

答案 2 :(得分:0)

即使使用同一个数据库,我也遇到了同样的问题 - 由于存储库中的某些合并,以及自动/手动迁移的混合。出于某种原因,EF没有考虑目标数据库,并根据数据库中已有的内容计算我需要执行的脚本。

要解决此问题,我会转到目标数据库上的[__MigrationHistory]表并获取最新的迁移名称。这将有助于EF确定数据库的状态,并且只执行所需的脚本。

然后运行以下脚本:

update-database -script -sourcemigration {latest migration name}

这将创建特定于目标数据库的更新脚本(连接字符串应该是正确的,如其他注释中所述) 如果需要,您还可以使用-force参数

通过这种方式,您可以将任何数据库更新到最新版本,如果它有MigrationHistory表,则无需更新您找到它的版本。

希望这有帮助

答案 3 :(得分:0)

我的制作和我的开发数据库不同步,它给了我无穷无尽的问题。我使用Red-Gate中的工具解决了这个问题,以匹配数据库。使用该工具后,数据库完全相同,但我的迁移工作不正常,我开始出现奇怪的错误,即尝试添加已经存在的表/列等等。我解决了这个问题。我刚刚删除了本地的迁移文件夹,重新创建了它,添加了初始迁移,更新了数据库,然后将此迁移文件(本地)的数据与主机上的数据进行了匹配(删除了迁移文件中的所有数据) host,并将本地相同的数据添加到主机中)。更详细的解释是:

migration synch developmental and production databases