Сопоставление типов SQL и CLR (LINQ to SQL)
Обновлен: November 2007
В LINQ to SQL модель данных реляционной базы данных сопоставляется с моделью объектов, выраженной на выбранном языке программирования. При выполнении приложения LINQ to SQL преобразует запросы LINQ модели объектов в код SQL и направляет их в базу данных для выполнения. Когда база данных возвращает результаты, LINQ to SQL преобразует их обратно в объекты, с которыми можно работать на языке программирования.
Для преобразования данных между моделью объектов и базой данных необходимо определить сопоставление типов. В LINQ to SQL используется сопоставление типов, в котором каждому типу CLR ставится в соответствие определенный тип SQL Server. Можно определить сопоставления типов и другие данные о сопоставлении, такие как структура базы данных и табличные связи, в рамках модели объектов, используя сопоставление на основе атрибутов. Также можно задать данные о сопоставлении вне модели объектов с помощью внешнего файла сопоставления. Дополнительные сведения см. в разделах Сопоставление на основе атрибутов (LINQ to SQL) и Справочные сведения о внешнем сопоставлении (LINQ to SQL).
В этом разделе обсуждаются следующие вопросы.
Сопоставление типов по умолчанию
Таблица правил сопоставления типов во время выполнения
Различия при выполнении в среде CLR и на SQL Server
Сопоставление перечислений
Сопоставление чисел
Сопоставление текста и XML
Сопоставление даты и времени
Сопоставление двоичных объектов
Прочие виды сопоставления
Сопоставление типов по умолчанию
Можно создать сопоставление модели объектов или внешний файл сопоставления автоматически в реляционном конструкторе объектов или в программе командной строки SQLMetal. В сопоставлениях типов по умолчанию для этих средств определяется, какие типы CLR выбираются в соответствии со столбцами, находящимися в базе данных SQL Server. Дополнительные сведения об использовании этих средств см. в разделе Создание модели объектов (LINQ to SQL).
Также можно использовать метод CreateDatabase для создания базы данных SQL Server на основе сведений о сопоставлении, содержащихся в модели объектов или во внешнем файле сопоставления. В сопоставлениях типов по умолчанию для метода CreateDatabase определяется, какой тип выбирается для создаваемых столбцов SQL Server в соответствии с типами CLR в модели объектов. Дополнительные сведения см. в разделе Как динамически создать базу данных (LINQ to SQL).
Таблица правил сопоставления типов во время выполнения
На следующей схеме показаны стандартные правила, по которым выполняется сопоставление определенных типов, когда данные получаются или сохраняются в базе данных. За исключением сериализации, LINQ to SQL не поддерживает сопоставление между типами CLR или SQL Server, которые не указаны в этой таблице. Дополнительные сведения о поддержке сериализации см. в разделе Двоичная сериализация.
Примечание. |
---|
Некоторые сопоставления типов могут приводить к возникновению исключений переполнения или потери данных в ходе преобразования данных в базу данных или из нее. |
Нестандартное сопоставление типов
В LINQ to SQL помимо сопоставлений типов по умолчанию, используемых в реляционном конструкторе объектов, программе SQLMetal и методу CreateDatabase доступны и другие сопоставления. Можно создать нестандартные сопоставления типов, явно указав их в DBML-файле. Затем этот DBML-файл используется для создания кода модели объектов и файла сопоставления. Дополнительные сведения см. в разделе Сопоставления пользовательских типов SQL-CLR (LINQ to SQL).
Различия при выполнении в среде CLR и на SQL Server
Поскольку между средами CLR и SQL Server существуют различия в точности и правилах выполнения кода, то правила и результаты вычислений могут оказать различными (в зависимости от их проведения). Вычисления, выполняемые в запросах LINQ to SQL, фактически преобразуются в язык Transact-SQL, а затем выполняются в базе данных SQL Server. Вычисления, проводимые вне запросов LINQ to SQL, выполняются в контексте среды CLR.
Например, ниже представлены некоторые отличия в работе среды CLR и SQL Server.
SQL Server применяет для некоторых типов данных порядок, отличный от порядка эквивалентных типов в среде CLR. Например, порядок данных типа UNIQUEIDENTIFIER в SQL Server отличается от порядка данных типа System.Guid в среде CLR.
Некоторые операции сравнения строк обрабатываются в SQL Server иначе, чем в среде CLR. Порядок сравнения строк в SQL Server зависит от параметров сортировки на сервере. Дополнительные сведения см. в разделе Работа с параметрами сортировки электронной документации по Microsoft SQL Server.
Для некоторых сопоставленных функций SQL Server может возвращать значения, отличные от аналогичных значений, возвращаемых средой CLR. Например, функции проверки равенства будут возвращать различные результаты, поскольку SQL Server считает равными две строки, различающиеся только конечными пробелами, в то время как с точки зрения среды CLR эти строки не равны.
Сопоставление перечислений
LINQ to SQL поддерживает два способа для сопоставления типа CLR System.Enum с типами SQL Server.
Сопоставление с числовыми типами SQL (TINYINT, SMALLINT, INT, BIGINT).
При сопоставлении типа System.Enum среды CLR с числовым типом SQL, выполняется сопоставление базового целочисленного значения CLR System.Enum со значением в столбце базы данных SQL Server. Например, если объект System.Enum с именем DaysOfWeek содержит элемент с именем Tue, базовое целочисленное значение для которого равно 3, то этому элементу сопоставляется значение 3 в базе данных.
Сопоставление с текстовыми типами SQL (CHAR, NCHAR, VARCHAR, NVARCHAR).
При сопоставлении типа CLR System.Enum с текстовым типом SQL выполняется сопоставление значения в базе данных SQL с именами элементов перечисления CLR System.Enum. Например, если объект System.Enum с именем DaysOfWeek содержит элемент с именем Tue, базовое целочисленное значение для которого равно 3, то этому элементу сопоставляется значение Tue в базе данных.
Примечание. |
---|
При сопоставлении текстовых типов SQL с типом CLR System.Enum в сопоставляемый столбец SQL включаются только имена элементов Enum. Прочие значения в столбце SQL, сопоставленном с Enum, не поддерживаются. |
Реляционный конструктор объектов и программа командной строки SQLMetal не выполняют автоматическое сопоставление типа SQL с классом CLR Enum. Такое сопоставление необходимо настроить вручную, изменив DBML-файл для использования реляционным конструктором объектов и программой SQLMetal. Дополнительные сведения о нестандартном сопоставлении типов см. в разделе Сопоставления пользовательских типов SQL-CLR (LINQ to SQL).
Поскольку столбец SQL, предназначенный для перечисления, будет иметь тот же тип, что и другие числовые и текстовые столбцы, эти средства не смогут определить, что столбец должен использовать для перечисления, и по умолчанию выполнят сопоставление, описанное в разделах Сопоставление чисел и Сопоставление текста и XML. Дополнительные сведения о создании кода с помощью DBML-файла см. в разделе Создание кода в LINQ to SQL.
Метод DataContext.CreateDatabase создает столбец SQL числового типа в соответствии с типом CLR System.Enum.
Сопоставление чисел
LINQ to SQL позволяет сопоставлять многие числовые типы CLR и SQL Server. В следующей таблице показаны типы CLR, которые выбираются реляционным конструктором объектов и программой SQLMetal при создании сопоставления модели объектов или внешнего файла сопоставления, основанного на базе данных.
Тип SQL Server |
Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal |
---|---|
BIT |
|
TINYINT |
|
INT |
|
BIGINT |
|
SMALLMONEY |
|
MONEY |
|
DECIMAL |
|
NUMERIC |
|
REAL/FLOAT(24) |
|
FLOAT/FLOAT(53) |
В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.
Тип CLR |
Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase |
---|---|
BIT |
|
TINYINT |
|
SMALLINT |
|
INT |
|
BIGINT |
|
SMALLINT |
|
INT |
|
BIGINT |
|
DECIMAL(20) |
|
DECIMAL(29,4) |
|
REAL |
|
FLOAT |
Можно выбрать другие сопоставления чисел, но некоторые из них могут вызвать исключения переполнения или потери данных в процессе преобразования данных в базу данных или из базы данных. Дополнительные сведения см. в разделе Таблица правил сопоставления типов во время выполнения.
Типы Decimal и Money
Точность, используемая по умолчанию для типа SQL Server DECIMAL (18 десятичных разрядов слева и справа от десятичного разделителя), намного меньше точности типа CLR System.Decimal, с которым он сопоставляется по умолчанию. Это может вызвать потерю точности при сохранении данных в базе данных. Однако противоположная ситуация может возникнуть, если для типа SQL Server DECIMAL задана точность, превышающая 29 разрядов. Если для типа SQL Server DECIMAL задана точность, превышающая точность типа CLR System.Decimal, то потеря точности может возникнуть при получении данных из базы данных.
Типы SQL Server MONEY и SMALLMONEY, которые также по умолчанию сопоставляются с типом CLR System.Decimal, имеют намного меньшую точность, что может вызвать исключения переполнения или потери данных при сохранении данных в базу данных.
Сопоставление текста и XML
Кроме того, существует множество текстовых типов и типов XML, для которых возможно сопоставление с помощью LINQ to SQL. В следующей таблице показаны типы CLR, которые выбираются реляционным конструктором объектов и программой SQLMetal при создании сопоставления модели объектов или внешнего файла сопоставления, основанного на базе данных.
Тип SQL Server |
Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal |
---|---|
CHAR |
|
NCHAR |
|
VARCHAR |
|
NVARCHAR |
|
TEXT |
|
NTEXT |
|
XML |
В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.
Тип CLR |
Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase |
---|---|
NCHAR(1) |
|
NVARCHAR(4000) |
|
NVARCHAR(4000) |
|
Пользовательский тип, реализующий методы Parse() и ToString() |
NVARCHAR(MAX) |
Можно выбрать множество других текстовых сопоставлений и сопоставлений XML, но некоторые из них могут вызвать исключения переполнения или потери данных в процессе преобразования данных в базу или из базы данных. Дополнительные сведения см. в разделе Таблица правил сопоставления типов во время выполнения.
Типы XML
Начиная с версии Microsoft SQL Server 2005 доступен тип данных SQL Server XML. Тип данных SQL Server XML можно сопоставить с типом XElement, XDocument или String. Если в столбце хранятся XML-фрагменты, которые невозможно считать в объект XElement, то столбец необходимо сопоставить с типом String, чтобы избежать ошибок времени выполнения. К XML-фрагментам, для которых необходимо сопоставление с типом String, относятся следующие:
последовательность XML-элементов;
атрибуты;
общие идентификаторы;
комментарии.
Типы XElement и XDocument можно сопоставить с типами SQL Server, как показано в разделе Таблица правил сопоставления типов во время выполнения, однако в методе DataContext.CreateDatabase для этих типов отсутствует сопоставление типов SQL Server по умолчанию.
Пользовательские типы
Если класс реализует методы Parse() и ToString(), то объект этого класса можно сопоставить с любым текстовым типом SQL (CHAR, NCHAR, VARCHAR, NVARCHAR, TEXT, NTEXT, XML). Объект сохраняется в базе данных путем передачи значения, возвращаемого методом ToString(), в сопоставленный столбец базы данных. Объект воссоздается при вызове метода Parse() со строкой, возвращаемой из базы данных.
Примечание. |
---|
LINQ to SQL не поддерживает сериализацию, выполняемую с помощью System.Xml.Serialization.IXmlSerializable. |
Сопоставление даты и времени
В LINQ to SQL можно сопоставлять многие типы даты и времени SQL Server. В следующей таблице показаны типы CLR, которые выбираются реляционным конструктором объектов и программой SQLMetal при создании сопоставления модели объектов или внешнего файла сопоставления, основанного на базе данных.
Тип SQL Server |
Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal |
---|---|
SMALLDATETIME |
|
DATETIME |
|
DATETIME2 |
|
DATETIMEOFFSET |
|
DATE |
|
TIME |
В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.
Тип CLR |
Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase |
---|---|
DATETIME |
|
DATETIMEOFFSET |
|
TIME |
Можно выбрать другие сопоставления даты и времени, но некоторые из них могут вызвать исключения переполнения или потери данных в процессе преобразования данных в базу данных или из базы данных. Дополнительные сведения см. в разделе Таблица правил сопоставления типов во время выполнения.
Примечание. |
---|
Начиная с версии Microsoft SQL Server 2008, доступны типы SQL Server DATETIME2, DATETIMEOFFSET, DATE и TIME. LINQ to SQL поддерживает сопоставление с этими новыми типами, начиная с версии платформы .NET Framework 3.5 с пакетом обновления 1 (SP1). |
System.Datetime
Диапазон и точность типа CLR System.DateTime превышают диапазон и точность типа SQL Server DATETIME, с которым по умолчанию выполняется сопоставление в методе DataContext.CreateDatabase. Чтобы избежать исключений, связанных с датами вне диапазона DATETIME, используйте тип DATETIME2, который доступен, начиная с версии Microsoft SQL Server 2008. Тип DATETIME2 может обеспечить соответствие параметров диапазона и точности с типом CLR System.DateTime.
В датах SQL Server не учитывается часовой пояс (TimeZone), но эта функция имеет богатую поддержку в среде CLR. Значения TimeZone сохраняются в базе данных без изменений, и преобразование TimeZone не выполняется, независимо от исходных данных DateTimeKind. Когда значения DateTime получаются из базы данных, они загружаются в DateTime без изменений, а DateTimeKind получает значение Unspecified. Дополнительные сведения о поддерживаемых методах System.DateTime см. в разделе Методы System.DateTime (LINQ to SQL).
System.TimeSpan
Microsoft SQL Server 2008 и платформа .NET Framework 3.5 с пакетом обновления 1 (SP1) позволяют сопоставлять тип CLR System.TimeSpan с типом SQL Server TIME. Однако между типом CLR System.TimeSpan и типом SQL Server TIME существует большая разница в поддерживаемом диапазоне. Сопоставление значений (меньше 0 или больше 23:59:59.9999999 часов) с типом SQL TIME вызовет исключение переполнения. Дополнительные сведения см. в разделе Методы System.TimeSpan (LINQ to SQL).
В Microsoft SQL Server 2000 и SQL Server 2005 нельзя сопоставлять поля базы данных с типом TimeSpan. При этом операции с типом TimeSpan поддерживаются, поскольку значения TimeSpan могут возвращаться операцией вычитания DateTime или входить в выражение в виде литерала или привязанной переменной.
Сопоставление двоичных объектов
Для многих типов SQL Server возможно сопоставление с типом CLR System.Data.Linq.Binary. В следующей таблице показаны типы SQL Server, для которых реляционный конструктор объектов и программа SQLMetal определяют тип CLR System.Data.Linq.Binary во время построения модели объектов или внешнего файла сопоставления, основанного на базе данных.
Тип SQL Server |
Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal |
---|---|
BINARY(50) |
|
VARBINARY(50) |
|
VARBINARY(MAX) |
|
VARBINARY(MAX) с атрибутом FILESTREAM |
|
IMAGE |
|
TIMESTAMP |
В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.
Тип CLR |
Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase |
---|---|
VARBINARY(MAX) |
|
VARBINARY(MAX) |
|
VARBINARY(MAX) |
Можно выбрать другие сопоставления двоичных объектов, но некоторые из них могут вызвать исключения переполнения или потери данных в процессе преобразования данных в базу или из базы данных. Дополнительные сведения см. в разделе Таблица правил сопоставления типов во время выполнения.
SQL Server FILESTREAM
Атрибут FILESTREAM для столбцов VARBINARY(MAX) доступен, начиная с версии Microsoft SQL Server 2008. Сопоставление с этим типом в LINQ to SQL поддерживается, начиная с версии платформы .NET Framework 3.5 с пакетом обновления 1 (SP1).
Столбцы VARBINARY(MAX) с атрибутом FILESTREAM можно сопоставлять с объектами Binary, но метод DataContext.CreateDatabase не может автоматически создавать столбцы с атрибутом FILESTREAM. Дополнительные сведения об атрибуте FILESTREAM см. в разделе Общие сведения о FILESTREAM электронной документации по Microsoft SQL Server.
Сериализация двоичных объектов
Если в классе реализован интерфейс ISerializable, объект этого класса можно сериализовать в любое двоичное поле SQL (BINARY, VARBINARY, IMAGE). Сериализация и десериализация объекта выполняется в соответствии с реализацией интерфейса ISerializable. Дополнительные сведения см. в разделе Двоичная сериализация.
Прочие виды сопоставления
В следующей таблице показаны сопоставления по умолчанию для некоторых типов, не упомянутых ранее. В следующей таблице показаны типы CLR, которые выбираются реляционным конструктором объектов и программой SQLMetal при создании сопоставления модели объектов или внешнего файла сопоставления, основанного на базе данных.
Тип SQL Server |
Тип CLR, по умолчанию используемый для сопоставления c реляционным конструктором объектов и программой SQLMetal |
---|---|
UNIQUEIDENTIFIER |
|
SQL_VARIANT |
В следующей таблице показано сопоставление типов по умолчанию, используемое методом DataContext.CreateDatabase для определения типов столбцов SQL, которые должны создаваться в соответствии с типами CLR, определенными в модели объектов или во внешнем файле сопоставления.
Тип CLR |
Тип SQL Server, по умолчанию используемый методом DataContext.CreateDatabase |
---|---|
UNIQUEIDENTIFIER |
|
SQL_VARIANT |
LINQ to SQL не поддерживает для этих типов никаких других сопоставлений. Дополнительные сведения см. в разделе Таблица правил сопоставления типов во время выполнения.
См. также
Ссылки
Сопоставление на основе атрибутов (LINQ to SQL)
Справочные сведения о внешнем сопоставлении (LINQ to SQL)
Несоответствия типов SQL-CLR (LINQ to SQL)