Fluent NHibernate — Создать схему базы данных, только если она не существует

#.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.

http://github.com/schambers/fluentmigrator/

http://code.google.com/p/migratordotnet/

Комментарии:

1. на самом деле Hbm2ddl может генерировать сценарии изменения с SchemaUpdate … но он не улавливает все, и я бы никогда не стал на это полагаться.

2. @dotjoe вы просто имеете в виду тот факт, что он не выполняет деструктивные обновления? Я использую SchemaUpdate в рабочей среде, и у меня никогда не было проблем с тем, что она что-то не улавливает.

3. @Gabe Moothart он не будет фиксировать изменения, такие как нулевая возможность столбца, но я думаю, что это будет считаться разрушительным изменением при переходе от нулевого столбца к ненулевому столбцу.

4. Спасибо! Рассмотрим это в дальнейшем, но на данный момент SchemaUpdate был тем, что я искал.