В случаях, когда система уже существует и подлежит, например, переделке, можно восстановить модель из схемы базы данных. Конечно, даже теоретически такое восстановление не может быть полным из-за разницы в семантике, но большую часть рутинной работы оно выполняет. Проведя один раз импорт, далее мы редактируем, структурируем модели и продолжаем работать только в обычном цикле изменений «через модель».
На что похожа логическая модель? Приведу пример описания из рабочего проекта, содержащего один пользовательский тип, один перечисляемый тип, две сущности и одну связь (отношение) между ними.
Пример модели в 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"