我为我的实体框架应用程序启用了迁移。现在,我想更新我的远程服务器上的数据库。我运行了这个命令:
PM> Update-Database -Script
所以它生成了一个sql脚本。但是,这个脚本包含了我在数据库中实际拥有的所有元数据,而不是所做的更改;所以,当我尝试在我的远程服务器上运行这个 sql 脚本时,它说表已经存在。
我如何生成只包含必要更新的 sql 脚本?
我为我的实体框架应用程序启用了迁移。现在,我想更新我的远程服务器上的数据库。我运行了这个命令:
PM> Update-Database -Script
所以它生成了一个sql脚本。但是,这个脚本包含了我在数据库中实际拥有的所有元数据,而不是所做的更改;所以,当我尝试在我的远程服务器上运行这个 sql 脚本时,它说表已经存在。
我如何生成只包含必要更新的 sql 脚本?
您可以为此指定特定的迁移。如果您有一个名为 Foo 的迁移,例如:
Update-Database -TargetMigration Foo -Script
它将为 Foo 迁移生成一个迁移脚本。将 Foo 替换为您需要在该服务器上运行的任何迁移。
Add-Migration InitialMigration
Add-Migration AddCustomers
Add-Migration AddProjects
假设您的项目中有上述三个迁移,并且您的本地数据库已应用所有这些迁移,但远程数据库只有 InitialMigration。您可以运行以下命令:
Update-Database -SourceMigration InitialMigration -TargetMigration AddProjects -Script
这将在远程服务器上应用两个迁移(AddCustomers 和 AddProjects)。
如果您可以通过远程桌面访问服务器,则可以执行命令行迁移工具,该工具通常位于 [projectFolder]/packages/EntityFramework.5.0.0/tools/migrate.exe
并这样称呼它:
Migrate.exe [StartupProjectName] /StartupDirectory:"[BIN folder path]" /ConnectionStringName:"[Connection String Name]" /StartupConfigurationFile:"[Path to web or app.config]"
当您部署应用程序的新版本时,您可以使用 MigrateDatabaseToLatestVersion Initializer 自动应用任何新迁移:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());