Table of Contents

Использование пользовательского файла отображения

Общие сведения

Пользовательский файл отображения это xml-файл, на основании которого осуществляется генерация LINQ-to-SQL классов. Он называется Mapping.xml и должен находиться в папке App_Data. Генерация LINQ-to-SQL классов в этом режиме осуществляется только при сброшенной опции Использовать прямое отображение из базы данных (Use direct mapping from database) на уровне сайта.

В текущей версии файл Mapping.xml вообще не генерируется автоматически. Вместо этого всегда генерируется пользовательский файл отображения по умолчанию DefaultMapping.xml, на основе которого должен быть вручную составлен файл Mapping.xml. В простейшем случае можно просто переименовать DefaultMapping.xml в Mapping.xml. Первичная автоматическая генерация mapping.xml была убрана из-за возможности случайной генерации LINQ-to-SQL классов на ненастроенном сайте, что могло привести к его неработоспособности.

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

Автоматическая генерация

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

  1. Удаляются пробелы и подчеркивания
  2. Русские названия переводятся в траслит
  3. Идентификаторы ссылочных полей генерируются на основе идентификаторов связанных контентов.
  4. К повторяющимся идентификаторам добавляется числовой суффикс.

Пример файла отображения

<?xml version="1.0" encoding="utf-8" ?>
<schema connectionStringName="qp_database" replaceUrls="true" useLongUrls="true">
  <content name="Event Category" mapped_name="Category" plural_mapped_name="Categories">
    <attribute name="Title" />
  </content>
  <content name="Events" mapped_name="Event" plural_mapped_name="Events" use_default_filtration="false">
    <attribute name="Title" />
    <attribute name="Category" />
    <attribute name="Category 2" mapped_name="SecondCategory" mapped_back_name="EventsBySecondCategory" />
    <attribute name="Location" />
    <attribute name="Date" />
    <attribute name="Event Description" mapped_name="Description" />
    <attribute name="Many" />
    <attribute name="Related Event" mapped_name="RelatedEvent" />
    <attribute name="SubEvents" />
    <attribute name="InLive" />
    <attribute name="SubTitle" />
  </content>
  <content name="Event Location" mapped_name="Location" plural_mapped_name="Locations">
    <attribute name="Title" />
  </content>
  <content name="Photos" mapped_name="Photo" plural_mapped_name="Photos">
    <attribute name="Name" />
    <attribute name="Description" />
    <attribute name="OwnerID" />
    <attribute name="Photo" mapped_name="Picture" />
  </content>
  <link id="17" mapped_name="RelatedEvent" plural_mapped_name="RelatedEvents"  />
</schema>

Элементы файла отображения

Элемент schema

Корневой элемент файла отображения. Отображение может быть настроено через базу данных на уровне сайта в секции Параметры сборки в LINQ-классы _(LINQ Assembling Parameters). При ручной настройке отображения конкретный сайт указывать не требуется, так как его идентификатор будет передан в процессе сборки.

connectionStringName

Название строки соединения в файле web.config сайта. Аналог в базе данных: поле Имя строки подключения (Connection string name). По умолчанию - qp_database.

replaceUrls

Включает замену плейсхолдеров <%=site_url%> и <%=upload_url%> для полей типа String, VisualEdit и Textbox. Замена работает в обе стороны, как при загрузке, так и при сохранении. Эта опция позволяет LINQ-классам поддерживать стандартное поведение Publishing Container'ов. Аналог в базе данных: опция Заменять URL (Replace URLs).

useLongUrls

Установка атрибута модифицирует поведение механизма замены плейсхолдеров (опция replaceUrls) так, что они будут заменяться на абсолютные URL, а не на относительные. Аналогичная опция есть для Publishing Container'ов. Аналог в базе данных: опция Использовать длинные URL (Use long URLs).

namespace

Пространство имен, в котором будут сгенерированы LINQ-классы. По умолчанию - пустое. Аналог в базе данных: поле Пространство имен для генерируемых классов (Namespace for generated classes).

class

Имя контекстного класса. По умолчанию - QPDataContext. Аналог в базе данных: поле Имя контекстного класса (Context Class Name).

content

Соответствует контенту QP7. При настройке отображения через базу данных соответствующие опции задаются на уровне контента в секции Параметры отображения в LINQ-классы (LINQ Mapping Parameters).

Если какой-либо контент не задан в отображении, то генерация класса для него проводится не будет (Аналог в базе данных: выключенная опция Отображать как класс (Map as class)).

name

Имя контента в QP7. По этому полю осуществляется поиск соответствия между отображением и БД. Если название контента(поля) в БД является недопустимым идентификатором в .NET, то необходимо задать атрибуты mapped_name и plural_mapped_name.

mapped_name

Отображаемое имя контента (единственное число). Используется как название класса. Аналог в базе данных: поле Имя (единственное) (Name (singular)).

plural_mapped_name

Отображаемое имя контента (множественное число). Используется при генерации ссылок на контент. Аналог в базе данных: поле Имя (множественное) (Name (plural)).

use_default_filtration

Поддержка стандартного поведения Publishing Container. Необходимо для того, чтобы работали расписание публицкации, workflow, архив. В предыдущих версиях реализовалось через вызов метода расширения ForFrontEnd(). В текущей версии метод оставлен для обратной совместимости, но в случае включенной фильтрации по умолчанию никаких действий не выполняет. При включенной опции LINQ-класс отображается не на таблицу CONTENT_NNN, а на представление CONTENT_NNN_LIVE (для stage-режима используется аналогичное представление CONTENT_NNN_STAGE вместо CONTENT_NNN_UNITED). Аналог в базе данных: опция Использовать фильтрацию по умолчанию (Use default filtration).

attribute

Соответствует полю контента QP7. При настройке отображения через базу данных соответствующие опции задаются на уровне поля. Если какое-либо поле не задано в отображении, то генерация свойства для него проводится не будет (Аналог в базе данных: выключенная опция Отображать как LINQ-свойство (Map as LINQ Property)).

name

Имя поля в QP7. По этому полю осуществляется поиск соответствия между отображением и БД. Если название контента(поля) в БД является недопустимым идентификатором в .NET, то необходимо задать атрибут mapped_name. Кроме того, изменение имени при отображении поля может понадобиться, чтобы исключить конфликт имен между полем и контентом.

mapped_name

Отображаемое имя поля. Используется как имя свойства в LINQ-классе. Аналог в базе данных: поле Имя LINQ-свойства (LINQ Property Name)

mapped_back_name

Имя обратного LINQ-свойства. Используется только для полей типа Связь один-ко-многим, так как для полей типа Связь многие-ко-многим обратное поле может задаваться явно (как поле контента). Аналог в базе данных: поле Имя обратного LINQ-свойства (LINQ Back Property Name)

Соответствует связи в QP7 (связь создается для поля типа Связь многие-ко-многим). При настройке отображения через базу данных соответствующие опции задаются на уровне одного из соответствующих полей. Если какая-либо связь не задана в отображении и не используется полями многие-ко-многим, то генерация класса для него проводится не будет (Аналог в базе данных: выключенная опция Отображать узловую таблицу как класс (Map Junction Table as Class). Если связь не задана в отображении, но используется полями, то будет сгенерирован класс с именем по умолчанию.

id

Идентификатор связи (таблица CONTENT_TO_CONTENT). По этому полю осуществляется поиск соответствия между отображением и БД.

mapped_name

Аналог в базе данных: поле Имя узлового LINQ-класса (единственное) (LINQ Junction Class Name (singular))

plural_mapped_name

Аналог в базе данных: поле Имя узлового LINQ-класса (множественное) (LINQ Junction Class Name (plural))