我们需要将现有项目从数据库优先迁移到代码优先。每个环境(DEV、TEST、PROD)都有稍微不同的数据库版本。不同之处在于DEV中的更改可能没有被推送到TEST和PROD。
,
我们正在使用实体框架6.1.3。
我们有一个部署数据库的数据库项目。发布操作将数据库与项目进行比较,并构建脚本以根据需要更改数据库。我们有一个带有edmx图的模型项目。我们从数据库中更新edmx,它根据数据库中的表生成实体。
我们正在用代码优先项目替换模型项目t(与edmx)。数据库项目将消失,我们新的代码优先项目将进行迁移。
,
我们使用EF PowerTools对数据库进行逆向工程并创建模型。然后我们创建一个迁移,它添加创建数据库所需的语句。但是,当我们更新数据库时,它崩溃了,因为表已经存在。接下来,我们创建了一个忽略更改的迁移。现在update-database什么也不做。这很好,因为一切都已经存在了。但是,如果我需要部署到一个新的空数据库,会发生什么呢?它不会创建这些对象中的任何一个。
使问题复杂化的是,DEV中从逆向工程中提取的一些对象不在TEST中。并且TEST中的一些表可能在DEV中发生了变化,然后PROD也可能发生变化。
,
我们如何从数据库优先过渡到代码优先,并且仍然有一个在所有环境中工作的可靠过程,并且可以构建一个独立的数据库?
我会从您的最低基线开始,可能是PROD,将其附加到您的项目并生成迁移"初始化"或其他内容。注释掉Up()代码和更新数据库。附加第二个最近的数据库,可能是TEST。再次执行更新数据库操作(初始化)。添加第二个迁移"TestChanges"。注释掉Up()代码和更新数据库。附加DEV数据库。应用第一个迁移(Update-Database -TargetMigration: Initial),应用第二个迁移。现在添加迁移"DevChanges",注释掉up代码,更新数据库。现在,您可以取消对迁移代码的注释,或者生成一个脚本,从这些点中获取:
Update-Database -Script -SourceMigration: Initial -TargetMigration: DevChanges
我可能会称这种迁移为更有意义的东西。
https://msdn.microsoft.com/en-us/data/jj591621特定