This is an old revision of the document!
Работа с контентами упрощается за счет того, что:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sqlmetal.exe
. Если на целевом компьютере не установлена Visual Studio, утилиту можно просто скачать.<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>
Сборка контентов QP7 в классы LINQ-to-SQL может осуществляться в двух режимах:
Переключение режимов осуществляется опцией Использовать прямое отображение из базы данных (Use direct mapping from database) на уровне сайта. Cама сборка запускается кнопкой Собрать Контенты (Assemble Contents) на странице Контенты (Contents). При этом в папке App_Code происходит полная перегенерация всех LINQ-классов текущего сайта. Следует иметь в виду, что данный процесс с большой долей вероятности приведет к перегрузке домена приложения, поэтому его стоит с осторожностью применять на продукционных сайтах.
Кроме этого, на уровне сайта существует опция Импортировать файл отображения в базу данных(Import mapping file to database), которая позволяет импортировать существующий пользовательский файл отображения в базу данных для последующей настройки через бэкенд QP7 и генерации файла отображения в автоматическом режиме. При успешном выполнении импорта данная опция автоматически сбрасывается, а опция Использовать прямое отображение из базы данных (Use direct mapping from database) автоматически устанавливается.
Опция Импортировать файл отображения в базу данных(Import mapping file to database) также может быть полезна для первичного заполнения настроек LINQ-to-SQL для существующего сайта с большим количеством контентов. Для этого сначала генерируется пользовательский файл отображения по умолчанию (при отключенной опции Использовать прямое отображение из базы данных (Use direct mapping from database), а затем проводится его импорт.
Доступен как LinqHelper.Context. Рекомендуется к использованию вместо создания каждый раз нового контекста через using (QPDataContext ctx = new QPDataContext())
, кроме тех случав, когда необходимо работать с несколькими контекстами сразу.
Для этого генерируются отдельные узловые классы для каждой связи. На уровне БД эти классы отображаются на специальные представления (LINK_NNN), которые ссылаются на единую физическую таблицу ITEM_TO_ITEM. Все используемые узловые сущности генерируются автоматически, если же необходимо заменить их названия, это можно сделать в настройках поля Many-To-Many или через тег link
файла отображения, задав в качестве идентификатора атрибут ID, и желаемые имена – в атрибутах mapped_name и mapped_plural_name.
При написании LINQ-запроса с фильтрацией по M2M-полю на уровне SQL алгоритм следующий:
IQueryable<Article> art = ctx.ArticlesCategories.Where(n => n.Category.Title == "main").Select(m => m.Article);
Для изменения полей M2M достаточно только вызывать методы Add и Remove соответствующей коллекции. Никакие другие поля для срабатывания механизма отслеживания изменений изменять не надо.
Поддержка стандартного поведения Publishing Container (подробнее) Замена плейсхолдеров <%=site_url%>
и <%=upload_url%>
производится для полей типа String, VisualEdit и Textbox. Замена работает в обе стороны, как при загрузке, так и при сохранении. Для включения этого механизма необходимо у тега schema
в файле отображения выставить атрибут replaceUrls=“true”
. Кроме того установкой атрибута useLongUrls=“true”
можно модифицировать поведение механизма, замены так, что плейсхолдеры будут заменяться на абсолютные URL, а не на относительные.
Поддержка стандартного поведения Publishing Container. Необходимо для того, чтобы работало расписание публицкации, workflow, архив. В предыдущих версиях реализовалось через вызов метода расширения ForFrontEnd(). В текущей версии метод оставлен для обратной совместимости, но в случае включенной фильтрации по умолчанию никаких действий не выполняет. Опция Использовать фильтрацию по умолчанию (Use default filtration) настраивается на уровне контента. При включенной опции LINQ-класс отображается не на таблицу CONTENT_NNN, а на представление CONTENT_NNN_LIVE (для stage-режима используется аналогичное представление CONTENT_NNN_STAGE вместо CONTENT_NNN_UNITED)
NewsArticle art = new NewsArticle(); art.Title = "some title"; art.Text = "some text"; LinqHelper.Context.NewsArticles.InsertOnSubmit(art); LinqHelper.Context.SubmitChanges();
В quantumart.dll добавлен обобщенный (generic) метод кэширования GetCachedEntity:
public T GetCachedEntity<T>(string key, Func<T> fillAction) public T GetCachedEntity<T>(string key, Func<string, T> fillAction) public T GetCachedEntity<T>(string key, double cacheInterval, Func<T> fillAction) public T GetCachedEntity<T>(string key, double cacheInterval, Func<string, T> fillAction)
Основное назначение: кэширование произвольных пользовательских коллекций, в том числе полученных с помощью LINQ. Обычно это: Dictionary<K, V>, List<T>.
Пример использования:
DBConnector cnn = new DBConnector(); List<Banner> banners = cnn.CacheManager.GetCachedEntity<List<Banner>>(pageAddress, 10, GetPageBanners);
Где GetPageBanners – метод, возвращающий List<Banner>, который будет вызван только при заполнении кэша. Метод может быть определен как без параметров, так и с единственным строковым параметром. Во втором случае в метод будет передано значение ключа (параметр key).
Метод может использоваться для кэширования любых ссылочных типов. Для того, чтобы кэшировать значимый тип (value type), необоходимо выполнить принудительный boxing (число можно для этого, например, преобразовать в строку). Данный метод также позволяет кэшировать null-значения, используя для них специальную обертку.
Discussion