Может ли NHibernate проверить, была ли сгенерирована схема БД? - PullRequest
9 голосов
/ 15 июня 2009

Итак, новый пользователь NHibernate; пытаясь обернуть мой мозг вокруг него.

Я обдумываю, как управлять развертыванием и последующим внедрением надстроек в веб-приложение (для которых могут потребоваться свои собственные классы постоянства).

Я думал, что использование SchemaExport для развертывания будет работать довольно хорошо, но мне было интересно, есть ли способ получить NHibernate, чтобы сказать мне обычным, основанным на коде способом, что экспорт схемы уже сделан, или нет. В основном, я хочу сделать что-то вроде этого псевдокода:

  if(!_cfg.HasSchemaForType(typeof(MyType))
       ExportSchema(typeof(MyType));
  else
       UpdateSchema(typeof(MyType));

, где две функции будут использовать внутренне SchemaExport или SchemaUpdate, соответственно.


РЕДАКТИРОВАТЬ: Ребята, я ценю ответ до сих пор, но они немного упускают суть. Я пытаюсь настроить способ приложения для добавления и удаления надстроек, которые могут потребовать внесения изменений в базу данных. Я не говорю о версии своего собственного кода или чего-то подобного (по крайней мере, не как его основная функция). Поэтому вопрос не в том, когда я разверну приложение, а в том, когда я добавляю или удаляю плагин. Был ли этот плагин (следовательно, проверка типа псевдокода) развернут ранее? Если это так, запустите обновление. Если нет, запустите экспорт. Имеет смысл?

Ответы [ 5 ]

17 голосов
/ 18 сентября 2009

Я думаю, что вы ищете SchemaUpdate.Execute вместо использования SchemaExport. SchemaUpdate создаст схему, если она еще не существует, или обновит ее при необходимости и желании.

Это работает для меня, используя как MSSQL, так и SQLite.

new SchemaUpdate(config).Execute(false, true);
10 голосов
/ 31 октября 2010

Да, есть, в 3.0, по крайней мере,

public static bool ValidateSchema()
{
    NHibernate.Tool.hbm2ddl.SchemaValidator myvalidator = new NHibernate.Tool.hbm2ddl.SchemaValidator(m_cfg);
    try
    {
        myvalidator.Validate();
        myvalidator = null;
        return true;
    }
    catch (Exception ex)
    {
        MsgBox(ex.Message, "Schema validation error");
    }
    finally
    {
        myvalidator = null;
    }

    return false;
}

Для части обновления выполните.

public static void UpdateSchema()
{
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg);
    schema.Execute(false, true);
    schema = null;
} // UpdateSchema
3 голосов
/ 15 июня 2009

Нет, NHibernate не делает то, что вы просите. Я предполагаю, что можно было бы написать некоторый код, который экспортировал бы схему, а затем сравнил ее со схемой базы данных. Но, вероятно, было бы проще экспортировать во временную базу данных и использовать сторонние инструменты, такие как redgate SQL Compare, для сравнения схем.

Даже если бы он сделал то, что вы просите, я не понимаю, как это помогло бы с развертыванием, потому что его цель - создать базу данных с нуля.

Отредактировано для добавления: предполагая, что каждый плагин имеет свой собственный набор таблиц, вы можете определить, была ли схема развернута, используя один из нескольких методов:

  • Попытка загрузить один из объектов плагина и перехватить исключение.
  • Изучите схему базы данных (используя SMO для SQL Server), чтобы проверить, существуют ли таблицы.
  • Создать запись в таблице при развертывании плагина.
2 голосов
/ 16 июня 2009

Целью экспорта схемы является создание полной схемы с нуля. Действительно полезно, если вы еще не развернули свое приложение.

После первого развертывания я настоятельно рекомендую использовать инструмент миграции, который поможет вам с дальнейшими расширениями / модификациями схемы. Если вы подумаете о большем, вы заметите, что вам даже требуется манипулирование данными (например, удаление неправильных данных, которые были сгенерированы в результате ошибки) по мере развития вашего приложения. Это все, с чем может помочь инструмент миграции.

Взгляните на:

Вот список других инструментов миграции для .net, на которые дан ответ на вопрос SO:

Первоначальная идея миграции возникла из Ruby on Rails и была "клонирована" в другие фреймворки в прошлом. Вот почему, безусловно, также полезно прочитать об оригинальной идее на http://guides.rubyonrails.org/migrations.html.

0 голосов
/ 15 июня 2009

Если у вас VS Team Suite или выпуск Database Developer, он может синхронизировать и отслеживать изменения, а затем создать сценарий развертывания, который создаст все нужные вам объекты. Также у RedGate есть продукт Schema Compare, который делает то же самое, если я не ошибаюсь.

...