Свободный NHibernate - создавать схему базы данных, только если не существует - PullRequest
36 голосов
/ 04 мая 2011

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

Ответы [ 2 ]

70 голосов
/ 04 мая 2011

Вместо этого вы можете просто использовать 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 не выполняет разрушительных обновлений (удалениетаблицы, столбцы и т. д.).Это только добавит их.

10 голосов
/ 04 мая 2011

ОБНОВЛЕНО (спасибо dotjoe)

Hbm2ddl может только выполнять различие схемы и обновлять только то, что изменилось с классом SchemaUpdate.Однако этот класс довольно прост в том, что он рассматривает только текущие объекты и различия в схеме.Если будут внесены существенные изменения (т.е. удалены сущности или удалены таблицы ссылок), это невозможно будет выяснить.

В более раннем проекте мы использовали hbm2ddl, однако с тех пор мы перешли на использование Fluent Migrator,Я бы сказал, что вам лучше всего использовать инструмент миграции, такой как Fluent Migrator или Migrator.NET.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...