Вопрос

Итак, новичок в использовании NHibernate;пытаюсь осмыслить это.

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

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

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

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


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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

new SchemaUpdate(config).Execute(false, true);

Да, есть, по крайней мере в 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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top