User Tools

Site Tools


developer:linq:context

This is an old revision of the document!


Использование контекстного класса

Под контекстным классом понимается класс, сгенерированный механизмом сборки в LINQ-to-SQL. Этот класс наследуется от DataContext. Его название может быть задано на уровне сайта или контента, либо используется значение по умолчанию - QPDataContext.

Экземпляр по умолчанию

Если требуется работать только с одним контекстным классом, то можно использовать экземпляр контекстного класса по умолчанию, доступный как LinqHelper.Context. Он создается при первом запросе к нему и в случае вызова в Web-среде сохраняется на время выполнения текущего Web-запроса. В случае не-Web-приложений экземпляр сохраняется в статическом свойстве класса LinqHelper на все время жизни приложения.

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

Явное инстанцирование контекстного класса

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

static QPDataContext Create(string connection, string siteName, MappingSource mappingSource)
static QPDataContext Create(string siteName, MappingSource mappingSource)
static QPDataContext Create(string connection, string siteName)
static QPDataContext Create(string connection)
static QPDataContext Create()
  • connection – строка подключения к БД
  • siteName – имя сайта (в одной БД может быть несколько сайтов)
  • mappingSource – источник данных для отображения на основе .map-файла, полученного в результате сборки контентов в LINQ-to-SQL классы

Если какой либо из параметров не задан, то вместо него используются соответствующие статические свойства контекстного класса.

Получение MappingSource

MappingSource обычно получают с помощью статического метода XmlMappingSource.FromXml, в который передается строка с XML-содержимым отображения. Само XML-содержимое можно получить с помощью одного из экземплярных методов класса DBConnector:

string GetDefaultMapFileContents(int site_id)
string GetMapFileContents(int site_id, string fileName)

В обоих случаях файл ищется в папке App_Data заданного сайта. В первом случае название файла не задается, и в папке ищется .map-файл основного контекстного класса. Основной контекстный класс может быть задан на уровне сайта, либо иметь значение по умолчанию - QPDataContext. Таким образом, если всё по умолчанию, то ищется файл QPDataContext.map. Содержимое файла кэшируется до первого изменения с помощью метода GetCachedFileContents.

Пример:

XmlMappingSource map = XmlMappingSource.FromXml(Cnn.GetDefaultMapFileContents(Cnn.GetSiteId("Sandbox Net")));
XmlMappingSource map2 = XmlMappingSource.FromXml(Cnn.GetMapFileContents(Cnn.GetSiteId("Sandbox Net"), "EventsDataContext.map"));

Cтатические свойства контекстного класса

Позволяют настроить значения по умолчанию, которые потом будут использованы при инстанцировании контекстных классов, в том числе и для LinqHelper.Context перед первым обращением к нему.

  • DefaultConnectionString – строка подключения к БД. Инициализируется строкой из секции connectionStrings файла web.config, название которой задано на уровне сайта. Если название не задано, то используется название по умолчанию - qp_database.
  • DefaultSiteName – имя сайта. Инициализируется именем сайта, для которого были сгенерированы LINQ-to-SQL классы.
  • DefaultXmlMappingSource – Инициализируется вызовом XmlMappingSource.FromXml(Cnn.GetDefaultMapFileContents(Cnn.GetSiteId(“имя сайта”))). В качестве имени указывается имя сайта, для которого были сгенерированы LINQ-to-SQL классы.

Пример изменения статических свойств:

QPDataContext.DefaultXmlMappingSource = XmlMappingSource.FromXml(Cnn.GetDefaultMapFileContents(Cnn.GetSiteId("Sandbox Net 7"))); 
QPDataContext.DefaultSiteName = "Sandbox Net 7"; 

Discussion

Enter your comment
 
developer/linq/context.1304626925.txt.gz · Last modified: 2011/05/05 23:22 by celutp