Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Для выделения нескольких сущностных классов в одну группу нужно у нескольких контентов задать одинаковое значение в поле «Имя дополнительного контекстного класса». В качестве значения нужно указывать полное имя класса с учетом пространств имён. Таким образом, один и тот же контент может участвовать в двух контекстных классах:
основном, задаваемом на уровне сайта; дополнительном, задаваемом на уровне контентов.Примечание: для предотвращения конфликта имён пространства имён для всех генерируемых контекстных классов (как основного, так и дополнительных) должны различаться.
При использовании компонента, использующего классы LINQ to SQL, для сайта необходимо:
Название | Описание |
Воссоздать структуру контентов | Также должны быть восстановлены данные об отображении в классы LINQ to SQL и значения свойств. |
Сгенерировать. map-файл привязки классов | Так как классы генерировать не надо, то в свойствах сайта можно установить опцию «Генерировать только. map-файл». |
- Многократное выполнение одних и тех же запросов без необходимости. Отсутствие понимания, что выполняется на веб-сервере, а что – на сервере СУБД. Получение от SQL-сервера лишних данных (аналог в SQL – select *), когда можно обойтись ограниченным набором полей с помощью select new. В конце цепочки операций LINQ в большинстве случаев желательно явно овеществлять результат (например, с помощью ToList()). Результат должен быть не IQueryable<T>, а IEnumerable<T> или T, иначе последующий foreach может привести к новому SQL-запросу на каждой итерации.
Добавление статьи:
NewsArticle art = new NewsArticle();
art. Title = "some title";
art. Text = "some text";
LinqHelper. Context. NewsArticles. InsertOnSubmit(art);
LinqHelper. bmitChanges();
Внимание: программа SQLMetal не входит в дистрибутив продукта.
В конфигурационный файл QP нужно добавить параметр SqlMetalPath, в качестве значения задать путь к программе SQLMetal (отвечает за генерацию SQL-классов). Программа устанавливается вместе с Visual Studio, путь к ней может выглядеть так: C:\Program Files\Microsoft SDKs\Windows\vn. nn\bin\sqlmetal. exe. Также программа доступна к составе Windows SDK.
Примечание: если в конфигурационном файле QP отсутствует параметр SqlMetalPath, то при генерации данных используется T4-шаблон.
Лог ошибок утилиты SQLMetal пишется в файл sqlmetal. log в директории App_Data. Ошибки обычно связаны с конфликтами имён.
Пользователю ОС, под которым запущен Application Pool (обычно это NETWORK SERVICE) необходимо дать право доступа «Modify» на директории:
App_Code (требуется для возможности генерации файлов классов), App_Data (для генерации промежуточных файлов отображений).В конфигурационный файл веб-сайта необходимо добавить ссылки на необходимые сборки:
<system. web>
<compilation>
<assemblies>
...
<add assembly="System. Data. Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<add assembly="System. Data. DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<add assembly="System. Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</assemblies>
...
</compilation>
</system. web>
...
<system. codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft. CSharp. CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5" />
<providerOption name="WarnAsError" value="false" />
</compiler>
</compilers>
</system. codedom>
Использование Entity Framework
В QP поддерживается работа с контентами с использованием Entity Framework (версии 6.0 и выше). Реализованы доступы на чтение и запись.
Для работы с Entity Framework требуется установить следующие NuGet-пакеты:
QP8.EntityFramework6, Quantumart (запись, работа с мета-данными). Особенности генерации EF- Выборочная загрузка полей. Поддерживаются асинхронные методы чтения.
Примечание: поддержка асинхронной записи отсутствует в текущей версии продукта.
- Поддержка локализации. Быстрая (по сравнению с LINQ) запись за счёт группового обновления данных. Использование отдельных развязочных таблиц для связей M2M (вместо Views, обращающихся к единой таблице). Поддерживаются обратные (в том числе несимметричные) связи М2М для сценариев расщепления статей. Для связей можно не создавать в модели обратные свойства (например, на сущность «Регион» могут ссылаться несколько контентов, а «Регион» может не ссылаться ни на кого). В модель добавлены системные сущности:
- User, UserGroup, StatusType.
- Генерация всех необходимых классов и интерфейсов осуществляется в Visual Studio автоматически с помощью T4-шаблона. Используется подход POCO. Классы используют EF 6. Сгенерированное сопоставление (mapping) использует EF Fluent API. Процесс генерации настраивается с помощью отдельного файла конфигурации.

Рисунок 12. Структура решения в Visual Studio.

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

Рисунок 14. Выделение поля в отдельную сущность.
Загрузка значений может быть «ленивой» или явной с использованием Include<T, TP>(…):
var included = m. Settings
.Include(x => x. Text)
.Where(z => z. Text. Value. Length > 10)
.FirstOrDefault();
Assert. IsNotNull(included. Text);
Assert. IsTrue(included. Text. Value. Length > 10);
Подходы к локализацииСелективное сопоставление
- Используется конвенция именования полей. В класс не попадают поля других языков. Региональный стандарт (англ. «locale») указывается при создании экземпляра контекста. Сопоставление с полем требуемого регионального стандарта осуществляется в среде выполнения (англ. «runtime»). Подходит для сценариев чтения. Поддерживается добавление нового регионального стандарта без повторной компиляции.

Рисунок 15. Сопоставление с полем требуемого регионального стандарта.
Установка нужного значения во время материализации сущностей
В модель включаются поля из других используемых региональных стандартов:
<?xml version="1.0" encoding="utf-8" ?>
<settings>
...
<Localization>
<UseSelectiveMappings>true</UseSelectiveMappings>
<Pattern>{fieldName}_{cultureAlias}</Pattern>
...
<CaseSensitive>true</CaseSensitive>
<CultureMappings>
<!--default-->
<Map cultureAlias="" to="ru-ru" />
<!--US english-->
<Map cultureAlias="EN" to="en-us" />
<Map cultureAlias="ENU" to="en-us" />
<Map cultureAlias="TAT" to="ru-tt" />
</CultureMappings>
</Localization>
</settings>
Обратные свойства для поля «Связь» типа М2МВ случае использования LINQ to SQL возможно возникновение ситуации с некорректное чтением при расщеплении сущности. Например, если экземпляр «Регион1» сущности «Регион» расщеплён и привязан к экземпляру «Тариф1» сущности «Тариф»:
- в режиме Stage у загруженного из БД «Тариф1» не будет указана связь с «Регион1», в режиме Live все связи будут присутствовать.

Рисунок 16. Связь сущностей (прямое представление).
Эта проблема решается добавлением дополнительного представления (англ. «View») для обратного поля. Шаблон EF позволяет генерировать сопоставление с использованием обратного представления.
По умолчанию обратные представления не используются. Для включения опции в свойствах поля «Связь» типа M2M требуется активировать свойство «Использовать отдельные обратные представления» (Use separate reverse views).

Рисунок 17. Прямое и обратное представления.
Порядок использованияПолучение файлов сопоставления и шаблона
В результате сборки контентов (пункт «Собрать контенты» (Assemble contents) в контекстном меню сайта) QP8 генерирует файл с описанием структуры данных контентов выбранного сайта. Формат имени файла – Имя контекстного классаMappingResult. xml. Полученный файл следует добавить в проект в Visual Studio.
Примечание: в качестве имени контекстного класса по умолчанию используется значение QPDataContext (см. свойство «Имя контекстного класса» в разделе Параметры сборки в LINQ-классы (LINQ Assembling Parameters)).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |


