Don*_*ers 5 entity-framework ef-code-first ef-database-first entity-framework-6 entity-framework-migrations
我们需要将现有项目从数据库优先迁移到代码优先。每个环境(DEV、TEST、PROD)的数据库版本略有不同。差异在于 DEV 中的更改可能尚未推送到 TEST 和 PROD。
--
我们使用实体框架 6.1.3。
我们有一个部署数据库的数据库项目。发布操作将数据库与项目进行比较,并构建脚本以根据需要更改数据库。我们有一个带有 edmx 图的模型项目。我们从数据库更新 edmx,这会根据数据库中的表生成实体。
我们正在用代码优先项目替换模型项目(带有 edmx)。数据库项目将消失,我们新的代码优先项目将进行迁移。
--
我们使用 EF PowerTools 对数据库进行逆向工程并创建模型。然后我们创建一个迁移并添加创建数据库所需的语句。但是,当我们更新数据库时,它会崩溃,因为表已经存在。接下来,我们创建了一个忽略更改的迁移。现在 update-database 什么也不做。这很好,因为一切都已经存在。但是如果我需要部署到新的空数据库会发生什么?它不会创建任何这些对象。
让事情变得复杂的是,从 DEV 中的逆向工程中提取的一些对象不在 TEST 中。并且 TEST 中的某些表可能在 DEV 中发生了更改。那么 PROD 也可能会有所不同。
--
我们怎样才能从数据库优先过渡到代码优先,同时仍然拥有一个适用于所有环境并可以构建独立数据库的可靠流程?
我会从你的最低基线开始,可能是 PROD。将其附加到您的项目并生成迁移“初始”或其他内容。注释掉 Up() 代码和更新数据库。附上第二个最新的数据库,可能是 TEST。再次更新数据库(初始)。添加第二个迁移“TestChanges”。注释掉 Up() 代码和更新数据库。附加 DEV 数据库。应用第一个迁移(Update-Database \xe2\x80\x93TargetMigration:初始),应用第二个。现在添加-迁移“DevChanges”,注释掉up代码,更新-数据库。现在,您可以取消注释迁移代码或生成脚本以从其中任何一点获取:
\n\nUpdate-Database -Script -SourceMigration: Initial -TargetMigration: DevChanges\nRun Code Online (Sandbox Code Playgroud)\n\n不过,我可能会将迁移称为更有意义的事情。
\n\nhttps://msdn.microsoft.com/en-us/data/jj591621#specic
\n