User Tools

Site Tools


developer:linq:context

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
developer:linq:context [2011/05/05 23:13]
celutp
developer:linq:context [2012/06/19 10:32] (current)
celutp [Использование XmlMappingSource]
Line 1: Line 1:
 ====== Использование контекстного класса ====== ====== Использование контекстного класса ======
  
-Под контекстным классом понимается класс, сгенерированный механизмом сборки в LINQ-to-SQL. Этот класс наследуется от DataContext. ​Его название ​может быть задано на уровне сайта или ​на уровне ​контента,​ либо используется ​значение по умолчанию - 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-файла ​основного контекстного класса. ​Основной контекстный класс либо задан на уровне сайта, ​либо имеет значение по умолчанию - //​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татические свойства контекстного класса =====
  
 Позволяют настроить значения по умолчанию,​ которые потом будут использованы при инстанцировании контекстных классов,​ в том числе и для **LinqHelper.Context** перед первым обращением к нему. Позволяют настроить значения по умолчанию,​ которые потом будут использованы при инстанцировании контекстных классов,​ в том числе и для **LinqHelper.Context** перед первым обращением к нему.
-  ***DefaultConnectionString** -- строка подключения к БД. Инициализируется строкой из секции //​connectionStrings//​ файла //​web.config//,​ название которой задано ​[[на уровне сайта]]. Если название не задано,​ то используется название по умолчанию - //​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 классы.
  
 Пример изменения статических свойств:​ Пример изменения статических свойств:​
developer/linq/context.1304626427.txt.gz · Last modified: 2011/05/05 23:13 by celutp