提问人:Safi Mustafa 提问时间:9/30/2017 最后编辑:Safi Mustafa 更新时间:10/13/2017 访问量:322
在数据库迁移失败时还原应用的上一个状态 (ClickOnce)
Restore Previous State of app on database migration failure (ClickOnce)
问:
如果数据库迁移失败,我想还原使用 ClickOnce 发布的 C# 应用程序的早期版本,因为数据库不是最新的,并且不支持最新版本的应用程序。
详
我正在开发一个应用程序,该应用程序将在没有互联网的偏远地区本地使用。一个人会每隔一段时间通过上网来更新他/她的应用程序,然后将应用程序部署到本地网络上。从那里,每个人都将能够获得应用程序的更新版本。我现在想要的是使用此应用程序进行数据库迁移,如果应用程序失败,它应该恢复到以前的版本。我已经使用 FluentMigrator 进行数据库迁移,并使用 ClickOnce 部署应用程序。我也浏览了这里的几乎所有链接,看看我该怎么做。我现在知道使用 ClickOnce 是不可能的。谁能告诉我其他方式,或者可能是某种黑客?我正在使用 ClickOnce 是因为它的自动更新功能,所以现在真的不想失去该功能。任何帮助将不胜感激。
答:
因此,如果在执行过程中出现问题,您需要运行以前版本的应用程序。
我不知道 ClickOnce 的解决方案,但它有类似物 - 松鼠。 坏消息是 Squirrel 也没有直接的解决方案,但它以物理方式存储了以前版本的应用程序,您可以运行它并且它可以工作(我刚刚在我的应用程序上检查了它)。
所以,有一个策略:
- 迁移到松鼠(他们有一个工具)
- 在紧急情况下 - 计算存储的先前版本的路径并运行它。相对路径应类似于“../app-1.1.1/myApp.exe”
但有一件事要记住。松鼠仅在从中升级应用程序时才存储以前的版本。首次安装后没有上一个版本。
祝你好运。
评论
从描述中可以看出,应用程序的不同版本共享一个数据库。当应用程序的新版本在计算机上上线时,它需要修补/迁移共享数据库。如果失败,则不会安装应用程序。让我们希望它在不损坏数据库的情况下失败。
有一些 clickonce 事件可以被卷入其中。也许可以创建一个自定义安装程序。
https://msdn.microsoft.com/en-us/library/system.deployment.application.applicationdeployment.aspx
发布 ClickOnce 应用程序 https://msdn.microsoft.com/en-us/library/748fh114.aspx
演练:为 ClickOnce 应用程序创建自定义安装程序 https://msdn.microsoft.com/en-us/library/dd997001.aspx
希望对您有所帮助。
评论
FluentMigrator 会跟踪数据库中的当前版本。它还跟踪当前应用程序版本中的最新版本。运行 Migrator 函数并检查当前版本中最新版本的 Migration 文件是否等于数据库中存储的最新版本。如果两者相等,则迁移成功。如果它们不相等,则可以运行 cmd 命令直接打开(删除或备份)控制面板的窗口并转到以前的版本。这是使用 ClickOnce 还原到以前版本的最佳方法。
try {
new MigrationsWrapper(AppManager.ConnectionString).MigrateToLatestVersion();
}
catch (Exception ex)
{
}
LatestVersionNumber = new MigrationsWrapper(AppManager.ConnectionStringADO).LatestVersionNumber;
CurrentVersionNumber = new MigrationsWrapper(AppManager.ConnectionStringADO).CurrentVersionNumber;
if (LatestVersionNumber > CurrentVersionNumber) {
string applicationName = ConfigurationManager.AppSettings["ApplicationName"].ToString();
string uninstallString = GetUninstallRegistryKeyByProductName(applicationName);
if (uninstallString != string.Empty) {
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/c " + uninstallString;
process.StartInfo = startInfo;
process.Start();
}
} else {
// Successfull
}
评论