#.net #database #nhibernate #c#-4.0 #fluent-nhibernate
#.net #База данных #nhibernate #c #-4.0 #свободно-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 способен выполнять только изменение схемы и обновлять только то, что изменилось с помощью класса SchemaUpdate. Однако этот класс довольно рудиментарен в том смысле, что он позволяет взглянуть только на текущие объекты и на то, чем отличается схема. Если были внесены существенные изменения (т. Е. удалены объекты или удалены таблицы ссылок), он не сможет это выяснить.
В более раннем проекте мы использовали hbm2ddl, однако с тех пор мы перешли на использование Fluent Migrator. Я бы сказал, что лучше всего использовать инструмент миграции, такой как Fluent Migrator или Migrator.NET.
Комментарии:
1. на самом деле Hbm2ddl может генерировать сценарии изменения с
SchemaUpdate
… но он не улавливает все, и я бы никогда не стал на это полагаться.2. @dotjoe вы просто имеете в виду тот факт, что он не выполняет деструктивные обновления? Я использую SchemaUpdate в рабочей среде, и у меня никогда не было проблем с тем, что она что-то не улавливает.
3. @Gabe Moothart он не будет фиксировать изменения, такие как нулевая возможность столбца, но я думаю, что это будет считаться разрушительным изменением при переходе от нулевого столбца к ненулевому столбцу.
4. Спасибо! Рассмотрим это в дальнейшем, но на данный момент SchemaUpdate был тем, что я искал.