Как автоматически обновить развернутую базу данных для конечных пользователей - PullRequest
1 голос
/ 01 мая 2009

Я прочитал довольно много вопросов о том, как обновить базу данных для разработчика и тому подобное, и я склоняюсь к использованию migratordotnet или чего-то подобного, однако, похоже, что обновления должны быть работать с чем-то вроде MSBuild или NAnt. Это не то, чего я должен ожидать от конечного пользователя.

В идеале процесс должен заключаться в том, чтобы пользователь установил новую версию приложения, запустил ее и позаботился обо всем за сценой. В зависимости от того, сколько времени занимает процесс, я могу отображать или не отображать индикатор выполнения, а затем все готово, использование приложения обычно блаженно не осознает, что есть такие вещи, как sql, msbuild, реляционная база данных или что-либо, даже удаленно техническое звучание.

Другая разная информация:

SQLCE, установленный xcopy.

Однопользовательская база данных, которая, скорее всего, не должна быть слишком большой.

Релизы будут довольно частыми, так как программа будет развиваться через пользовательский ввод запрашиваемых функций.

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

Использование LINQ to SQL в качестве ORM. (Я сначала обновите базу данных, затем
запустить SQLMetal для регенерации
занятия?)

Выполнение TDD (впервые) и интересно как автоматизировать тестирование обновления.

Visual C # Express, поэтому нет VS плагины.

Edit:

Я предполагаю, что MSBuild поставляется с .NET Framework, а не только с VS, так что я полагаю, что это не проблема, и я могу просто использовать migratordotnet и просто использовать оболочку для msbuild. При необходимости я, возможно, мог бы перенаправить вывод на консоль и выполнить некоторый наивный анализ строки, чтобы получить информацию о прогрессе, но я прибегну к этому, если, похоже, это займет достаточно много времени, чтобы гарантировать отображение реального прогресса, а не просто индикатор хода выполнения.

Ответы [ 4 ]

2 голосов
/ 01 мая 2009

Вот вариант:

  1. Храните версию базы данных где-нибудь в вашей базе данных
  2. При запуске убедитесь, что база данных актуальна, сравнив константу в вашем коде с версией БД.
  3. Если нет, запустите набор сценариев для создания / изменения таблиц, преобразования данных и т. Д.

Если вы уже развернули и не имеете версии db, просто проверьте схему на то, что вы ожидаете в последней версии db.

Для проверки:

  1. Начать со старой базы данных
  2. Создать метод для UpdateDatbaseIfNeeded ()
  3. Тест должен пройти, если схема обновляется и устанавливается версия базы данных

Вы также можете предварительно загрузить свою тестовую базу данных для проверки на различные проблемы преобразования, которые должны быть обработаны вашими сценариями обновления.

1 голос
/ 16 мая 2009

Единственное, что я хотел бы добавить к вышеприведенным комментариям, это то, что вам также нужно беспокоиться об операции типа пакета.

Для обновления приложений с SQL CE 3.1 до 3.5 необходимо установить библиотеки 3.5, а затем выполнить операцию пакета для обновления формата базы данных. Вы можете иметь это в виду, как часть вашего процесса. Для SQL CE 3.5 простое открытие базы данных в 3.5 сделает ее более несовместимой с 3.1 - то есть если ваш пользователь затем восстановит резервную копию приложения или что-то, что вы не сможете загрузить Поэтому вам нужно перехватывать эти ошибки во время соединения и убедиться, что вы обрабатываете все исключения из MS для несовместимости версий.

Другой недостаток с 3.1 и 3.5 заключается в том, что вы не можете одновременно загружать их в Visual Studio. Поэтому тестирование этого процесса снова и снова означает виртуальную машину, которую вы можете многократно стирать и обновлять. Вы не можете сделать это на своей машине разработки. (

0 голосов
/ 14 мая 2009

Вот что вы можете сделать с Wizardby .

Имеет API, который позволяет программно выполнять задачи миграции схемы базы данных. Вам понадобится соответствующий IDbPlatform (там также SqlCePlatform), IMigrationVersionInfoManager, который имеет стандартную реализацию, которая хранит информацию о версии в таблице SchemaInfo, IMigrationScriptExecutive, которая также имеет реализацию по умолчанию и IMigrationService сам. Далее вы пишете определение миграции , компилируете его в свою сборку и передаете в IMigrationService.Migrate(connectionString, null, yourMigrationDefinition).

0 голосов
/ 01 мая 2009

Обычно этот способ обычно выполняется так, что миграция базы данных выполняется во время установки; во время установки у вас есть целый набор кода (обычно полностью настраиваемого), который обнаруживает существующую версию базы данных и выполняет все операции, связанные с переносом данных из существующей базы данных в новую базу данных (т.е. создание временных таблиц, копирование данных из существующих таблиц в временные таблицы, удаление существующих таблиц, создание новых таблиц, выполнение объединений для добавления данных из временных таблиц в новые таблицы и т. д.). Процесс по определению довольно сложный. Мне неизвестны какие-либо инструменты, которые автоматизируют процесс конвертации специально для рабочей среды конечного пользователя. (Обычно существует много особых случаев, связанных с базами данных конечных пользователей.)

...