Восстановить предыдущее состояние приложения при сбое миграции базы данных (ClickOnce)

Я хочу восстановить предыдущую версию приложения С#, опубликованную с помощью ClickOnce, если сбой миграции базы данных невозможен, потому что база данных не будет последней и не будет поддерживать последнюю версию приложения.

Подробнее

Я разрабатываю приложение, которое будет использоваться локально в удаленных районах, где Интернет недоступен. Человек будет обновлять свое приложение каждый раз, получая интернет как-то, а затем разворачивает приложение в локальной сети. Оттуда каждый сможет получить обновленную версию приложения. Теперь я хочу использовать миграцию базы данных с помощью этого приложения, и если приложение не работает, оно должно быть восстановлено до предыдущей версии. Я уже использовал FluentMigrator для миграции базы данных и использовал ClickOnce для развертывания приложения. Я также просмотрел почти все ссылки, чтобы посмотреть, как я могу это сделать. Теперь я знаю, что это невозможно с помощью ClickOnce. Может кто-нибудь сказать мне какой-то другой способ или может быть какой-то взлом?. Я использую ClickOnce из-за его функции автоматического обновления, поэтому на самом деле не хочу терять эту функциональность сейчас. Любая помощь будет оценена.

Ответ 1

FluentMigrator отслеживает текущую версию в базе данных. Он также отслеживает последнюю версию в текущей версии приложения. Запустите функцию Migrator и проверьте, соответствует ли последняя версия файлов миграции текущей версией последней версии, хранящейся в базе данных. Если оба равны, то миграция прошла успешно. Если они не равны, вы можете запустить команду 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
}

Ответ 2

Итак, вы хотите запустить предыдущую версию приложения, если во время выполнения возникнет какая-то проблема.

Я не знаю решения для ClickOnce, но для него есть аналог - Squirrel. Плохая новость о том, что Squirrel также не имеет прямого решения, но она физически хранит предыдущую версию приложения, и вы можете запускать ее, и она работает (я просто проверил ее в своем приложении).

Итак, есть стратегия:

  • Перейдите к белке (они инструмент для нее)
  • в случае возникновения непредвиденных обстоятельств - укажите путь к сохраненной предыдущей версии и запустите его. Относительный путь должен быть похож на "../app-1.1.1/myApp.exe"

Но есть одна вещь, о которой нужно помнить. Squirrel хранит предыдущую версию, только если она обновила приложение. После первой установки нет предыдущей версии.

Удачи.

Ответ 3

В описании разные версии приложения используют одну базу данных. Поскольку новая версия приложения переходит в прямом эфире на компьютере, ему необходимо выполнить патч/перенести общую базу данных. Если это не удается, приложение не устанавливает. Позвольте надеяться, что он потерпит неудачу, не повредив базу данных.

Есть события 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

Надеюсь, что это поможет.