Fluent NHibernate - создать схему базы данных только в случае отсутствия
У меня есть приложение, в котором я использую Fluent Nhibernate для создания моей базы данных. До сих пор я каждый раз воссоздавал схему базы данных. Код, который делает это, следующий:
public NhibernateSessionFactory(IPersistenceConfigurer config)
{
_sessionFactory = Fluently.Configure().
Database(config).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
ExposeConfiguration(BuildSchema).
BuildSessionFactory();
}
private static void BuildSchema(Configuration config)
{
// if (DbExists(config))
// return;
new SchemaExport(config).Create(false, true);
}
Обратите внимание на "if (DbExists(config))
". Это то, что я хотел бы сделать. Я хотел бы создать схему только в том случае, если она на самом деле еще не существует. И в следующем шаге - я хотел бы обновить
он создается, если он не обновляется.
Как мне это достичь? Я ожидаю config.DatabaseExists()
, но я не вижу ничего подобного. Я вижу некоторые возможности хакерского решения, но каков типичный рекомендуемый способ его решения?
Ответы
Ответ 1
Вместо этого вы можете использовать SchemaUpdate
, он обновит схему, если она существует, и создаст ее, если она не будет:
public NhibernateSessionFactory(IPersistenceConfigurer config)
{
_sessionFactory = Fluently.Configure().
Database(config).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true)).
BuildSessionFactory();
}
Одно предупреждение: SchemaUpdate
не выполняет деструктивные обновления (удаление таблиц, столбцов и т.д.). Он добавит их только.
Ответ 2
ОБНОВЛЕНО (спасибо dotjoe)
Hbm2ddl способен выполнять только diff схемы и обновлять только то, что изменилось с помощью класса SchemaUpdate. Однако этот класс довольно примитивен тем, что он рассматривает только текущие объекты и то, как схема отличается. Если были сделаны значительные изменения (например, удалены сущности или удалены ссылки на таблицы), он не сможет понять это.
В более раннем проекте мы использовали hbm2ddl, однако с тех пор мы перешли на использование Fluent Migrator. Я бы сказал, что лучше всего использовать инструмент миграции, например Fluent Migrator или Migrator.NET.
http://github.com/schambers/fluentmigrator/
http://code.google.com/p/migratordotnet/