Я изучаю использование 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? Или кто-нибудь порекомендует использовать ручной подход, и если да, то почему?