Подтвердить что ты не робот

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(), но я не вижу ничего подобного. Я вижу некоторые возможности хакерского решения, но каков типичный рекомендуемый способ его решения?

4b9b3361

Ответ 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/