Пример файла XML-маппинга для импорта можно загрузить по следующей ссылке: ImportSettings.xml. В него входят следующие ключевые теги:

1.        ImportSettings

2.        Name

3.        Schema

3.1.        TypeMapping

3.2.        TypeMap

3.2.1.        TypeFullName

3.2.2.        TableName

3.2.3.        FilterExpression

3.2.4.        KeyMemberName

3.2.5.        KeyMemberType

3.2.6.        KeyColumnName

3.2.7.        KeyColumnType

3.2.8.        EmptyReferenceValues

3.2.9.        MemberMapping

3.2.9.1.        MemberMap

3.2.9.1.1.        MemberName

3.2.9.1.2.        MemberTypeName

3.2.9.1.3.        ColumnName

3.2.9.1.4.        ColumnTypeName

3.2.9.1.5.        MemberExpression

4.        Parameters

Приведенные теги являются общими для настройки как импорта так и экспорта. Фреймворк сам определяет, как их использовать в том или ином случае.

В экспорте не используется обязательные параметры KeyMemberName, KeyMemberType, KeyColumnName, KeyColumnType, но они все равно должны быть заполнены. Эти параметры имеют следующее назначение:

Эта информация сохраняется в персистентном объекте ExternalKeyPair (см. описание раздела <KeyMemberName></KeyMemberName> далее).

 

Назначение тегов.

Каждый стартовый элемент должен быть закрыт тегом.

ImportSettings - стартовый элемент сериализованной настройки операции.

Name  - наименование сериализованной настройки операции, может быть пустым.

Schema – стартовый элемент сериализации схемы.

TypeMapping – стартовый элемент  сериализации маппирования типов, может состоять из нескольких отдельных сериализованных типов данных (TypeMap).

TypeMap – стартовый элемент сериализации маппинга одного типа данных.

TypeFullName – имя типа в который будет производится импорт данных. Обязателен для заполнения.

TableName – имя таблицы. Фактически указывает на именованный участок в источнике данных. Для корректной работы требуется заполнить имя у первого TypeMap.

Если для некоторого типа в схеме маппирования не указывать тег TableName, то фреймворк не будет пытаться зачитывать входящие данные из XML для этого типа. При этом структура маппинга для типа будет загружена в схему.

Если импортируемая сущность содержит ссылки на другие сущности, то необходимо чтобы XML-файлы этих ссылочных сущностей уже были созданы.

FilterExpression – вычисляемое выражение написанное по правилам класса СriteriaOperator. Если в ImportSettings заполнено FilterExpression, то на считанные из xml данные накладывается условие фильтрации указанное в настройке. Эта настройка активна только при работе с источником данных DataSetDataSource.

KeyMemberName, KeyMemberType, KeyColumnName, KeyColumnType – параметры индексирования процесса импорта, применяются для исключения дублирования проимпортированных объектов.

Пример:

...

<KeyMemberName>Oid</KeyMemberName>

<KeyMemberType>System.Guid</KeyMemberType>

<KeyColumnName>NREC</KeyColumnName>

<KeyColumnType>string</KeyColumnType>

...

KeyMemberName, KeyMemberType – имя ключевого поля и его тип в импортируемом объекте. KeyColumnName, KeyColumnType – имя и тип поля в источнике данных. Каждое успешное  добавления нового объекта при импорте сопровождается созданием записи типа ExternalKeyPair.

Также в раздел <KeyMemberName></KeyMemberName> можно поместить список полей, по которым будет определяться равенство двух импортируемых объектов. Имена полей следует разделить символом «;».

Если внутри <KeyMemberName></KeyMemberName> указано больше одного поля, то в KeyMemberType необходимо поместить значение «CriteriaOperator».

Пример:

Рассмотрим работу с типом Goods. Если задать значение

KeyMemberName = "Code;Name"

то  каждый объект, добавленный в БД, будет запоминаться в следующем виде:

"Code='4279110105504652' and Name='БОЛТ Ф 40 Д 150 М 30_XX_'"

КeyColumnName - составные ключи. Каждое отдельное имя ключа обрамляется кавычками ("). Поля можно разделять любым символом. Если в KeyColumnName первым символом является двойная кавычка, то значение этого поля будет разобрано как составной ключ.  Затем по этим ключам будет сформирована составная запись составного ключа в служебном объекте.

Пример:

для поля <KeyColumnName>"NREC" "BARKOD"</KeyColumnName> будет создана следующая запись:

{"NREC":"0A030000000000B1h";"BARKOD":"_025110000000002";}

EmptyReferenceValues – содержит список значений, которые должны быть заменены на  значение null при импорте.

Существуют источники данных, архитектура которых не предусматривает значения null. В этом случае такие значения как «0», пробел, хххххх и т.д. определяют пустое незаполненое, проинициализированное по-умолчанию значение. Использование настройки EmptyReferenceValues позволит заменить в конечной системе такие значения на null.

MemberMapping - стартовый элемент сериализованной настройки маппирования.

MemberMap - стартовый элемент отдельной настройки одного элемента мапирования.

MemberName – имя поля, в которое будут импортироваться данные.

MemberTypeName – тип поля, в которое будут импортироваться данные.

ColumnName – имя поля, из которого будут зачитываться данные для импорта, по этому имени производится поиск во входном потоке данных из источника.

ColumnTypeName – имя типа поля, из которого будут зачитываться данные для импорта, по этому имени производится поиск во входном потоке данных из источника.

MemberExpression – настройка по значению которого можно произвести вычисления с импортируемые данными. Правила вычисления используются по правилам класса ExpressionEvaluator.

Замечание:

При создании ссылочной сущности будет выполнена проверка на наличие одноименной.

Пример:

Для каждого ссылочного типа делается проверка:

          <MemberMap>

            <MemberName>Country</MemberName>

            <MemberTypeName>Xafari.BC.CD.Country</MemberTypeName>

            <ColumnName>DATOB</ColumnName>

            <ColumnTypeName>string</ColumnTypeName>

            <MemberExpression />

          </MemberMap>

Проверяется наличие описания для типа Xafari.BC.CD.Country в настройке импорта. В найденном описании ищется соответствующие MemberName для поля  DATOB.

          <MemberMap>

            <MemberName>Name</MemberName>

            <MemberTypeName>System.String</MemberTypeName>

            <ColumnName>DATOB</ColumnName>

            <ColumnTypeName>string</ColumnTypeName>

            <MemberExpression />

          </MemberMap>

Если Name найдено, то фреймворк попытается найти в БД объект типа Xafari.BC.CD.Country, у которого поле Name = значению из входящего DATOB. Если поиск успешен, то тогда объект ссылочного типа Xafari.BC.CD.Country не создается, а используется найденный.

 

Parameters – список дополнительных параметров импорта. Для импорта доступны следующие дополнительные параметры:

keyssave – аналог, задаваемый в списке параметров при запуске импорта с помощью утилиты RunCmd.

DecimalSeparator – разделитель целой и десятичной части числа.

DatePattern – формат даты.

Две последние настройки перекрывают установки локальной CultureInfo на момент импорта.

Исключительные ситуации: «нулевая» и «неизвестная» ссылки.

В процессе импорта объектов и заполнения ассоциаций (ссылок) возможно появление следующих исключительных ситуаций:

Для обработки таких ситуаций приняты следующие меры:

Класс Xafari.Data.TypeMap предоставляет список EmptyReferenceValues. Этот список содержит варианты значений «нулевых» ссылок.

Класс Xafari.Data.ImportSettings предоставляет булевские свойства SkipEmptyReferences и SkipUnknownReferences. Эти свойства управляют созданием объектов при обнаружении «нулевых» или «неизвестных» ссылок. Если SkipEmptyReferences=false, то для «нулевых» ссылок создаются «нулевые» объекты, иначе - не создаются. Если SkipUnknownReferences=false, то для «неизвестных» ссылок создаются объекты, иначе - не создаются.

Пример: значения «нулевых» ссылок задаются в коде.

 

    typeMap.EmptyReferenceValues.AddRange(new List<string>()  

   {

      "",

      "000000000000000h"

 

   });

 

Применение Parameters:

 

<Parameters>

 <Item>

         <Key>SkipEmptyReferences</Key>

         <Value type="System.Boolean">

                 <boolean>true</boolean>

         </Value>

 </Item>

 <Item>

         <Key>DecimalSeparator</Key>

         <Value type="System.String">

                 <string>.</string>

         </Value>

 </Item>

 <Item>

         <Key>DatePattern</Key>

         <Value type="System.String">

                 <string>dd/MM/yyyy</string>

         </Value>

 </Item>

</Parameters>

 

Параметр SkipEmptyReferences указывает на необходимость создания записи справочника в случае, если импортированный объект ссылается на несуществующий справочник.