Синхронизация классов и таблиц при использовании ORM
У меня не было большого опыта работы с ORM. Я пытаюсь найти лучший способ обработать добавление / удаление свойств из сопоставленного класса, в идеале автоматическим и универсальным способом.
Я использую ServiceStack.OrmLite и SQLite.
Целью базы данных является хранилище документов. Нет никаких внешних ключей / проблем ссылочной целостности.
НАПРИМЕР
public class Foo
{
public Bar {get; set;}
public Baz {get; set;}
}
Создает таблицу Foo с колонками Bar, Baz.
В идеальном мире класс Foo никогда бы не изменился, поэтому мне не пришлось бы об этом беспокоиться, но на самом деле это могло бы произойти.
Допустим, Фу также нужна собственность Quz.
public class Foo
{
public Bar {get; set;}
public Baz {get; set;}
public Quz {get; set;}
}
С чтением все в порядке, Quz просто возвращается как ноль, но вставка завершается неудачно, потому что столбец Quz отсутствует. Это имеет смысл.
Допустим, Баз больше не требуется.
public class Foo
{
public Bar {get; set;}
public Quz {get; set;}
}
Чтение / вставка работает нормально, однако в базовой таблице все равно будет столбец Baz, который немного запутан.
Учитывая, что это серверное приложение, которое не будет перезапускаться часто, я рассмотрел и отклонил несколько вещей:
При запуске, если таблица Foo существует, считайте ее во временное хранилище, удалите и заново создайте Foo (это означает, что таблица будет создана с правильной схемой), а затем снова вставьте данные. Кажется, что это работает нормально и поддерживает синхронизацию схемы с классом, однако это слишком медленно.
При запуске запросите базовую таблицу, чтобы получить определения ее столбцов и использовать отражение, чтобы выяснить, какими должны быть столбцы для класса Foo. Добавить / удалить столбцы по мере необходимости. Я почти уверен, что смогу применить этот подход к работе, но он более сложный, чем идеальный, и я не уверен, что это хорошая идея.