我有一个我在客户上安装的Web应用程序'计算机供其内在使用。我使用C#MVC5和代码优先实体框架。我使用自动migration = true但我停下来并将其设置为false。我将它安装在生产环境(发布)上 - 使用deploy-package(没有Visual Studio)。
我有一个客户使用该应用程序 - 版本1.现在我想升级到版本2.我想启用升级App的DB(在生产文件中,从包中安装CMD),但是如果出现任何问题,可以降级数据库 - 但不删除现有行。
例如 - 如果我有一张桌子" Items"和项目有Key, Name, Location
。在升级时,我添加了一个新列:Email
。降级时 - 新列将被删除。
我在Visual Studio上创建了迁移,我得到了这个代码(它仅用于示例 - 我有更多的迁移):
public partial class AddEmail : DbMigration
{
public override void Up()
{
AddColumn("dbo.Items", "Email", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Items", "Email");
}
}
现在,我在现有版本上安装了应用程序的新版本并且运行正常 - 添加了新列并使用了新代码。我添加了一些项目(行)。
现在,如何重新安装旧版本以便删除新列?实际上我想要回滚新的迁移 - 但我不想丢失新行,只想丢失新列。
答案 0 :(得分:13)
在this article中,有一个解释如何创建从一个迁移迁移到另一个迁移的脚本 - 升级或降级。 所以我运行了程序包管理器控制台 -
Update-Database -Script -TargetMigration: MyMigration1
并获得了SQL脚本。
我需要对它进行一些修复,然后我只是在生产数据库上运行它来降级数据库。
答案 1 :(得分:0)
您可以使用此技术降级到特定迁移:https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific
请记住,这需要目标迁移,因此您应该使用Add-Migration Initial -IgnoreChanges配置数据库的基线快照(请参阅https://msdn.microsoft.com/en-us/data/dn481501.aspx)否则使用Update-Database -TargetMigration:0
当您回滚时,如果列中存在数据,它将中止,因此您可能需要执行Update-Database -Force