在数据库迁移失败时恢复应用程序的先前状态 (ClickOnce)

Restore Previous State of app on database migration failure (ClickOnce)

我想恢复使用 ClickOnce 发布的以前版本的 C# 应用程序,如果数据库迁移失败,因为数据库不是最新的并且不支持最新版本的应用程序。

详情

我正在开发一个应用程序,该应用程序将在没有互联网可用的偏远地区本地使用。一个人会每隔一段时间通过某种方式获取互联网更新 his/her 应用程序,然后将应用程序部署到本地网络上。从那里每个人都将能够获得更新版本的应用程序。我现在想要的是使用此应用程序进行数据库迁移,如果该应用程序失败,它应该恢复到以前的版本。我已经使用 FluentMigrator 进行数据库迁移,并使用 ClickOnce 部署应用程序。我也几乎遍历了这里的每个 link,看看我该怎么做。我现在知道使用 ClickOnce 是不可能的。谁能以其他方式告诉我或可能是某种黑客?我正在使用 ClickOnce,因为它具有自动更新功能,所以现在真的不想失去该功能。任何帮助将不胜感激。

因此,如果在执行过程中出现问题,您需要 运行 以前版本的应用程序。

我不知道 ClickOnce 的解决方案,但有类似的解决方案 - Squirrel。 坏消息是 Squirrel 也没有直接的解决方案,但它物理上存储了以前版本的应用程序,你可以 运行 它并且它可以工作(我刚刚在我的应用程序上检查过)。

所以,有一个策略:

  1. 迁移到松鼠(他们有 a tool 个)
  2. 在紧急情况下 - 计算存储的先前版本的路径和 运行 它。相对路径应该像“../app-1.1.1/myApp.exe”

但是要记住一件事。 Squirrel 只有在升级应用程序时才会存储以前的版本。第一次安装后没有之前的版本

祝你好运。

根据描述,应用程序的不同版本共享同一个数据库。随着应用程序的新版本在机器上上线,它需要 patch/migrate 共享数据库。如果失败,则应用程序不会安装。希望它在不破坏数据库的情况下失败。

有可以嵌入的 clickonce 事件。也许创建自定义安装程序。

https://msdn.microsoft.com/en-us/library/system.deployment.application.applicationdeployment_events.aspx

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 跟踪数据库中的当前版本。它还会跟踪当前应用程序版本中的最新版本。 运行 迁移器功能,检查当前版本中迁移文件的最新版本是否等于数据库中存储的最新版本。如果两者相等,则迁移成功。如果不相等则可以运行 cmd 命令直接打开(删除或备份)window 控制面板并转到以前的版本。这是使用 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
}