2009-06-15 3 views
8

Итак, новичок NHibernate; пытаясь обернуть вокруг меня мозг.Может ли NHibernate проверить, была ли создана схема db?

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

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

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

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


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

ответ

3

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

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

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

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

Не пытайтесь решить проблему развертывания приложения. Я добавил некоторые дополнительные примечания, чтобы уточнить. Спасибо за ваш ответ! – Paul

+0

Я не думаю, что он имеет в виду во время развертывания ... это должно быть во время выполнения или времени инициализации ... плагины должны будут отвечать за свои собственные зависимости. – Webjedi

+0

Thanks; Я назвал ваш «ответом», поскольку он был самым полным. Я думаю, что отдельная забота о том, что треки, которые были развернуты плагинами, вероятно, лучший путь, который вы предлагаете в своей третьей пуле. – Paul

0

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

+0

У меня нет версии VS, но я не пытаюсь управлять этим на уровне разработчиков; цель - создать полевое приложение, которое администраторы могут добавлять/удалять плагины. – Paul

2

Цель экспорта схемы - сгенерировать полную схему с нуля. Очень полезно, если вы еще не развернули приложение.

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

Посмотрите в:

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

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

+0

Правильно, я знаю разницу между SchemaExport и SchemaUpdate; поэтому я хотел бы узнать, был ли уже запущен начальный скрипт. – Paul

16

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

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

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

Да есть, в 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 

 Смежные вопросы

  • Нет связанных вопросов^_^