Как выполнить несколько изменений базы данных одновременно с помощью NHibernate? - PullRequest
1 голос
/ 13 декабря 2010

Я изучаю использование Fluent NHibernate в настольном приложении, которое использует 3 разных файла базы данных. (Ну, 3 разных типа.)

  • DB1 - это основной файл базы данных, содержащий таблицы A, B, C и D.
  • DB2 - это файл базы данных, содержащий подробные данные (X выборок в секунду, сеанс программы получит новый файл, поскольку они могут стать очень большими) в таблице E.
  • DB3 - это файл базы данных, используемый для экспорта и импорта данных между пользователями (содержит 1 строку из A, 1 из B и все E, принадлежащие данной строке A и B)

Создание этого на самом деле не проблема, так как функция SchemaExport.Create делает это отлично.

Проблема, с которой я сталкиваюсь, заключается в том, что я точно не знаю, каков наилучший способ изменить мои таблицы. Точнее, сделать несколько обновлений версии одновременно. Мое приложение в настоящее время версии 1, поставляется с форматом базы данных версии 1, на следующей неделе я поднимаю все до версии 2 - я могу обновить базу данных с помощью SchemaUpdate.Execute - и в следующем месяце я поднимаю все до версии 3, и я могу сделать то же самое снова , Но я хочу, чтобы мои пользователи могли обновляться с версии 1 до версии 3.

Если бы я делал все вручную, я бы создал таблицу с именем version в каждом файле базы данных, которая содержит версию. Затем я проверил бы это поле по текущей версии и выполнил бы запросы таблицы ALTER. Например:

if (db_version < LATEST_VERSION) {
  switch (db_version + 1) {
    case 2: Execute("ALTER TABLE A..."); Execute("UPDATE A..."); break;
    case 3: Execute("ALTER TABLE B..."); break;
  }
}

Используя этот подход (при непосредственном использовании поставщика базы данных SQLite), мне нужно было бы предусмотреть только 1 версию моей модели данных, 1 службу обновлений, которая обрабатывает все, но мне нужно было бы создать базу данных и файлы модели данных вручную, и Мне нужно обновить как минимум два файла .db и 2 службы обновления (по одному для каждого типа БД). Который можно рассматривать как дублирующую работу. (Я нашел миграцию базы данных Banshee примером того, что я имею в виду.)

Используя NHibernate, я исключаю процесс поддержки файла базы данных и модели данных, но единственный способ увидеть обновления 1–3 - сохранить устаревшую версию каждой модели данных и выполнить что-то вроде:

namespace Version1 {
  public class A {}
  DoUpdate();
}

namespace Version2 {
  public class A {}
  DoUpdate();
}

Полностью ли я смотрю на это неправильно или мое дело просто сложное, и мне лучше использовать ручной подход? Что было бы лучшим решением для обновления и перехода с версии 1 на 3 с помощью Fluent NHibernate? Или кто-нибудь порекомендует использовать ручной подход, и если да, то почему?

1 Ответ

2 голосов
/ 13 декабря 2010

Я не могу ответить, как это сделать с помощью Fluent NHibernate, потому что я никогда не придумал хорошего способа. На мой взгляд, он не настроен на реальную миграцию базы данных. Итак, для всех моих проектов Fluent NHibernate я использую http://code.google.com/p/migratordotnet/ Это не идеально, но оно делает свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...