В случаях, когда система уже существует и подлежит, например, переделке, можно восстановить модель из схемы базы данных. Конечно, даже теоретически такое восстановление не может быть полным из-за разницы в семантике, но большую часть рутинной работы оно выполняет. Проведя один раз импорт, далее мы редактируем, структурируем модели и продолжаем работать только в обычном цикле изменений «через модель».

На что похожа логическая модель? Приведу пример описания из рабочего проекта, содержащего один пользовательский тип, один перечисляемый тип, две сущности и одну связь (отношение) между ними.

Пример модели в Genie Lamp

name="TEntityId" baseType="int" />

name="Granularity">

name="Day" value="0">

name="Month" value="1" default="true">

name="Year" value="2">

name="FiscalYear">

name="Id" type="TEntityId" primaryid="true" autoincrement="true" />

name="Name" type="TCaption" uniqueid="true">

name="Granularity" type="Granularity">

name="FromDate" type="date">

name="ToDate" type="date">

name="Closed" type="boolean" default="false">

name="GranularityName" type="string" persisted="false">

lang="ru">Возвращает локализованое название грануляции

name="CreatePeriods" access="public">

lang="ru">

Создает периоды финансового года

между датами начала и окончания

в соответствии с грануляцией. Например, для фин. года,

совпадающего с календарным, и помесячной грануляцией

будут созданы 12 месячных периодов

type="void"/>

name="FindPeriodIdByDate" access="public">

lang="ru">

Возвращает ID периода по заданной дате, "0" если не найден

name="periodDate" type="datetime"/>

type="TEntityId"/>

name="DeleteCascade" access="public">

type="void"/>

name="Period">

name="Id" type="TEntityId" primaryid="true" autoincrement="true" />

name="FiscalYearId" type="TEntityId">

name="FromDate" type="date">

name="FiscalYearId"/>

name="PeriodNumber" type="smallint">

name="ToDate" type="date">

entity="Period" name="FiscalYear"

entity2="FiscalYear" name2="Periods"

cardinality="M:1">

attribute="FiscalYearId" attribute2="Id" />

Теперь необходимо задать конфигурацию в описании проекта. Предположим, что мы хотим создать 3-звенное приложение со следующими логическими слоями:

• слои хранения будут развёрнуты на SQL Server или Oracle;

• слой домена под управлением NHibernate;

• слой веб-служб на базе ServiceStack (вместо WCF, имеющего под Mono/Linux ограничения).

Пример конфигурации проекта в Genie Lamp

fileName="MyModel.xml" />

name="SqlServer"

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" />

… Другие параметры "заклинания"

name="OracleDb"

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" />

name="NHibernate"

type="GenieLamp.Genies.NHibernate.NHibernateGenie"

Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги