This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
developer:linq:context [2011/05/05 23:18] celutp |
developer:linq:context [2012/06/19 10:32] (current) celutp [Использование XmlMappingSource] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Использование контекстного класса ====== | ====== Использование контекстного класса ====== | ||
- | Под контекстным классом понимается класс, сгенерированный механизмом сборки в LINQ-to-SQL. Этот класс наследуется от DataContext. Его название может быть задано на [[developer:linq:db_mapping|уровне сайта или контента]], либо используется значение по умолчанию - QPDataContext. | + | Под контекстным классом понимается класс, сгенерированный механизмом сборки в LINQ-to-SQL. Этот класс наследуется от //DataContext//. Имя класса может быть задано на [[developer:linq:db_mapping|уровне сайта или контента]], в случае отсутствия используется имя класса по умолчанию - //QPDataContext//. |
===== Экземпляр по умолчанию ===== | ===== Экземпляр по умолчанию ===== | ||
Line 8: | Line 8: | ||
При создании независимого от БД кода следует иметь в виду, что экземпляр контекстного класса, доступный как **LinqHelper.Context** по умолчанию использует настройки с которыми он был сгенерирован. Сменить эти настройки можно до первого обращения к **LinqHelper.Context** через изменение статических свойств контекстного класса. | При создании независимого от БД кода следует иметь в виду, что экземпляр контекстного класса, доступный как **LinqHelper.Context** по умолчанию использует настройки с которыми он был сгенерирован. Сменить эти настройки можно до первого обращения к **LinqHelper.Context** через изменение статических свойств контекстного класса. | ||
+ | |||
+ | Cуществует возможность использования нескольких экземпляров по умолчанию в Web-среде одновременно (если они находятся в разных пространствах имен). Единственное требование: чтобы имена сайтов, с которыми они работают, различались. | ||
===== Явное инстанцирование контекстного класса ===== | ===== Явное инстанцирование контекстного класса ===== | ||
Line 27: | Line 29: | ||
*//mappingSource// -- источник данных для отображения на основе .map-файла, полученного в результате сборки контентов в LINQ-to-SQL классы | *//mappingSource// -- источник данных для отображения на основе .map-файла, полученного в результате сборки контентов в LINQ-to-SQL классы | ||
- | Если какой либо из параметров не задан, то вместо него используются соответствующие статические свойства контекстного класса. | + | Если какой либо из параметров не задан, то вместо него используются соответствующие статические свойства контекстного класса, которые можно изменить перед вызовом метода создания. |
- | ===== Получение MappingSource ===== | + | ==== Особенности использования ==== |
- | MappingSource обычно получают с помощью статического метода **XmlMappingSource.FromXml**, в который передается строка с XML-содержимым отображения. Само XML-содержимое можно получить с помощью одного из экземплярных методов класса DBConnector: | + | В обычном сценарии использования LINQ-to-SQL классов, сушностные классы используют экземпляр контекстного по умолчанию (**LinqHelper.DataContext**) в тех случаях, когда им требуется внутри себя подгрузить какие-то данные, например для реализации M2M-полей. Но в случае явного инстанцирования контекстного класса, это не будет работать, так как внешний и внутренний контексты будут отличаться. Поэтому у каждого экземпляра сущностного класса теперь есть свойство **InternalDataContext**, которое позволяет явно задать внутренний контекст для таких операций. По умолчанию оно инициализируется значением **LinqHelper.DataContext**. |
- | <code c#>string GetDefaultMapFileContents(int site_id)</code> | + | Необходимость задавать внутренний контекст возникает при явном инстанцировании контекстного класса и использовании следующих операций: |
- | <code c#>string GetMapFileContents(int site_id, string fileName)</code> | + | - Добавление новых статей. При этом экземпляр контекстного класса можно передавать прямо в конструкторе сущностного класса. Важно задать контекст до сохранения статьи. |
+ | - Все операции с M2M-полями (свойствами-коллекциями внутри сущностных классов). Контекст необходимо задать у экземпляра сущностного класса перед обращением к его M2M-полю. | ||
+ | - Использование [[developer:linq:image|дополнительных свойств полей-изображений]]. Контекст необходимо задать у экземпляра сущностного класса перед обращением к дополнительному полю. | ||
- | Файл ищется в папке //App_Data// заданного сайта. В качестве имени файла по умолчанию используется имя .map-файла основного контекстного класса. Основной контекстный класс либо задан на [[developer:linq:db_mapping|уровне сайта]], либо имеет значение по умолчанию - //QPDataContext//. Таким образом, если всё по умолчанию, то ищется файл //QPDataContext.map//. Содержимое файла кэшируется до первого изменения с помощью метода [[api:cache#GetCachedFileContents|GetCachedFileContents]]. | + | <code c#> |
+ | EventsArticle event = new EventsArticle(context); | ||
+ | </code> | ||
+ | |||
+ | <code c#> | ||
+ | var item = ctx.TestArticles.Where(n => n.Id == 3737).Single(); | ||
+ | var newCat = ctx.TestCategoryArticles.Where(n => n.Id == 1856).Single(); | ||
+ | item.InternalDataContext = ctx; | ||
+ | item.Categories.Add(newCat); | ||
+ | ctx.SubmitChanges(); | ||
+ | </code> | ||
+ | |||
+ | Если необходимо применение контекста сразу для коллекции объектов, то возможно использование метода, расширяющего IEnumerable<T>: **ApplyContext(DataContext context)**, определенного для каждого сущностного класса. | ||
+ | |||
+ | <code c#> | ||
+ | foreach (var item in ctx.PhotosArticles.Where(n => n.Photo != null).ApplyContext(ctx)) | ||
+ | { | ||
+ | // use item.PhotoUrl; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===== Использование XmlMappingSource ===== | ||
+ | |||
+ | Источник данных для отображения обычно получают с помощью статического метода [[http://msdn.microsoft.com/ru-ru/library/system.data.linq.mapping.xmlmappingsource.fromxml.aspx|XmlMappingSource.FromXml]], в который передается строка с XML-содержимым отображения. Само XML-содержимое можно получить с помощью одного из экземплярных методов класса DBConnector: | ||
+ | * [[api:dbconnector:mapping#GetMapFileContents|GetMapFileContents]] | ||
+ | * [[api:dbconnector:mapping#GetDefaultMapFileContents|GetDefaultMapFileContents]] | ||
Пример: | Пример: | ||
Line 44: | Line 74: | ||
XmlMappingSource map2 = XmlMappingSource.FromXml(Cnn.GetMapFileContents(Cnn.GetSiteId("Sandbox Net"), "EventsDataContext.map")); | XmlMappingSource map2 = XmlMappingSource.FromXml(Cnn.GetMapFileContents(Cnn.GetSiteId("Sandbox Net"), "EventsDataContext.map")); | ||
</code> | </code> | ||
+ | |||
===== Cтатические свойства контекстного класса ===== | ===== Cтатические свойства контекстного класса ===== | ||
Line 49: | Line 80: | ||
Позволяют настроить значения по умолчанию, которые потом будут использованы при инстанцировании контекстных классов, в том числе и для **LinqHelper.Context** перед первым обращением к нему. | Позволяют настроить значения по умолчанию, которые потом будут использованы при инстанцировании контекстных классов, в том числе и для **LinqHelper.Context** перед первым обращением к нему. | ||
***DefaultConnectionString** -- строка подключения к БД. Инициализируется строкой из секции //connectionStrings// файла //web.config//, название которой задано на [[developer:linq:db_mapping|уровне сайта]]. Если название не задано, то используется название по умолчанию - //qp_database//. | ***DefaultConnectionString** -- строка подключения к БД. Инициализируется строкой из секции //connectionStrings// файла //web.config//, название которой задано на [[developer:linq:db_mapping|уровне сайта]]. Если название не задано, то используется название по умолчанию - //qp_database//. | ||
- | ***DefaultSiteName** -- имя сайта. Иницализируется именем сайта, для которого были сгенерированы LINQ-to-SQL классы. | + | ***DefaultSiteName** -- имя сайта. Инициализируется именем сайта, для которого были сгенерированы LINQ-to-SQL классы. |
- | ***DefaultXmlMappingSource** -- источник отображения. Иницилизируется вызовом //XmlMappingSource.FromXml(Cnn.GetDefaultMapFileContents(Cnn.GetSiteId("имя сайта")))//. В качестве имени указывается имя сайта, для которого были сгенерированы LINQ-to-SQL классы. | + | ***DefaultXmlMappingSource** -- Инициализируется вызовом //XmlMappingSource.FromXml(Cnn.GetDefaultMapFileContents(Cnn.GetSiteId("имя сайта")))//. В качестве имени указывается имя сайта, для которого были сгенерированы LINQ-to-SQL классы. |
Пример изменения статических свойств: | Пример изменения статических свойств: |