В случаях, когда система уже существует и подлежит, например, переделке, можно восстановить модель из схемы базы данных. Конечно, даже теоретически такое восстановление не может быть полным из-за разницы в семантике, но большую часть рутинной работы оно выполняет. Проведя один раз импорт, далее мы редактируем, структурируем модели и продолжаем работать только в обычном цикле изменений «через модель».
На что похожа логическая модель? Приведу пример описания из рабочего проекта, содержащего один пользовательский тип, один перечисляемый тип, две сущности и одну связь (отношение) между ними.
Пример модели в Genie Lamp
Создает периоды финансового года
между датами начала и окончания
в соответствии с грануляцией. Например, для фин. года,
совпадающего с календарным, и помесячной грануляцией
будут созданы 12 месячных периодов
Возвращает ID периода по заданной дате, "0" если не найден
name="periodDate" type
="datetime"/>entity2
="FiscalYear" name2="Periods"cardinality
="M:1">Теперь необходимо задать конфигурацию в описании проекта. Предположим, что мы хотим создать 3-звенное приложение со следующими логическими слоями:
• слои хранения будут развёрнуты на SQL Server или Oracle;
• слой домена под управлением NHibernate;
• слой веб-служб на базе ServiceStack (вместо WCF, имеющего под Mono/Linux ограничения).
Пример конфигурации проекта в Genie Lamp
type
="GenieLamp.Genies.SqlServer.SqlServerGenie"assembly
="GenieLamp.Genies.SqlServer"active
="false"outDir
="%PROJECT_DIR%/../SQL/SqlServer-%TARGET_VERSION%"outFileName
="%PROJECT_NAME%.sql"updateDatabase
="true"targetVersion
="2008">name="Database.Create" value
="false" />… Другие параметры "заклинания"
type
="GenieLamp.Genies.Oracle.OracleGenie"assembly
="GenieLamp.Genies.Oracle"active
="true"outDir
="%PROJECT_DIR%/../SQL/Oracle-%TARGET_VERSION%"outFileName
="%PROJECT_NAME%.sql"outFileEncoding
="iso-8859-1"updateDatabase
="false"targetVersion
="10g">name="UniqueIndexConstraint" value
="true" />…
type
="GenieLamp.Genies.NHibernate.NHibernateGenie"