Поделиться через


Сопоставление типов SQL-CLR

В LINQ to SQL модель данных реляционной базы данных сопоставляется с объектной моделью, выраженной на выбранном языке программирования. При запуске приложения LINQ to SQL преобразует языковые интегрированные запросы в объектную модель в SQL и отправляет их в базу данных для выполнения. Когда база данных возвращает результаты, LINQ to SQL преобразует результаты обратно в объекты, с которыми можно работать на собственном языке программирования.

Чтобы преобразовать данные между объектной моделью и базой данных, необходимо определить сопоставление типов . LINQ to SQL использует сопоставление типов для сопоставления каждого типа среды CLR с определенным типом SQL Server. Можно определить сопоставления типов и другие сведения о сопоставлении, такие как структура базы данных и связи таблиц, внутри объектной модели с сопоставлением на основе атрибутов. Кроме того, можно указать сведения о сопоставлении вне объектной модели с помощью внешнего файла сопоставления. Для получения дополнительной информации см. Attribute-Based отображение и внешнее отображение.

В этом разделе рассматриваются следующие моменты:

Сопоставление типов по умолчанию

Объектную модель или файл внешнего сопоставления можно создать автоматически с помощью конструктора объектно-реляционных моделей (О/R Designer) или инструмента командной строки SQLMetal. Сопоставления типов по умолчанию для этих средств определяют, какие типы CLR выбираются для отображения на столбцы в базе данных SQL Server. Дополнительные сведения об использовании этих средств см. в статье "Создание объектной модели".

Можно также использовать CreateDatabase метод для создания базы данных SQL Server на основе сведений о сопоставлении в объектной модели или внешнем файле сопоставления. Сопоставления типов по умолчанию для метода определяют, какие типы столбцов SQL Server создаются для соответствия CLR-типы в объектной модели. Дополнительные сведения см. в разделе "Практическое руководство. Динамическое создание базы данных".

Матрица поведения сопоставления типов в процессе выполнения

На следующей схеме показано ожидаемое поведение времени выполнения для сопоставления конкретных типов при извлечении или сохранении данных в базе данных. За исключением сериализации, LINQ to SQL не поддерживает сопоставление между типами данных CLR или SQL Server, которые не указаны в этой матрице. Дополнительные сведения о поддержке сериализации см. в разделе "Двоичная сериализация".

Таблица сопоставления типов данных SQL Server с SQL CLR

Замечание

Некоторые сопоставления типов могут привести к переполнению или исключениям потери данных при переводе в базу данных или из нее.

Сопоставление настраиваемых типов

При использовании LINQ to SQL вы не ограничены сопоставлениями типов по умолчанию, используемыми конструктором O/R, SQLMetal и методом CreateDatabase. Вы можете создавать сопоставления пользовательских типов, явно указав их в файле DBML. Затем вы можете использовать этот ФАЙЛ DBML для создания кода объектной модели и файла сопоставления. Для получения дополнительной информации см. раздел SQL-CLR сопоставления настраиваемых типов.

Различия в поведении между средой CLR и выполнением SQL

Из-за различий в точности и выполнении среды CLR и SQL Server вы можете получать различные результаты или выполнять разные действия в зависимости от того, где выполняются вычисления. Вычисления, выполняемые в запросах LINQ to SQL, фактически претворяются в Transact-SQL, а затем выполняются в базе данных SQL Server. Вычисления, выполняемые вне запросов LINQ to SQL, выполняются в контексте среды CLR.

Например, ниже приведены некоторые различия в поведении среды CLR и SQL Server:

  • SQL Server заказывает некоторые типы данных по-разному, чем данные эквивалентного типа в среде CLR. Например, данные SQL Server типа UNIQUEIDENTIFIER упорядочены по-разному, чем данные CLR типа System.Guid.

  • SQL Server обрабатывает некоторые операции сравнения строк, отличные от среды CLR. В SQL Server поведение сравнения строк зависит от параметров сортировки на сервере. Дополнительные сведения см. в разделе "Работа с параметрами сортировки".

  • SQL Server может возвращать разные значения для некоторых сопоставленных функций, отличных от среды CLR. Например, функции равенства будут отличаться, так как SQL Server считает две строки равными, если они отличаются только в конечных пробелах; в то время как среда CLR считает их не равными.

Сопоставление Enum.

LINQ to SQL поддерживает сопоставление типа CLR System.Enum с типами SQL Server двумя способами.

  • Сопоставление числовых типов SQL (TINYINT, SMALLINT, , INTBIGINT)

    При сопоставлении типа CLR System.Enum с числовым типом 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, содержит участника с базовым целочисленным значением 3, этот участник сопоставляется со значением Tue базы данных.

Замечание

При сопоставлении текстовых System.Enum типов SQL с средой CLR Enumдобавьте только имена элементов в сопоставленном столбце SQL. Другие значения не поддерживаются в столбце SQL, сопоставленном с Enum.

Средство командной строки O/R Designer и SQLMetal не могут автоматически сопоставить тип SQL с классом CLR Enum . Необходимо явно настроить это сопоставление, настроив DBML-файл для использования конструктором O/R и SQLMetal. Для получения дополнительной информации о сопоставлении настраиваемых типов см. раздел SQL-CLR Сопоставления настраиваемых типов.

Так как столбец SQL, предназначенный для перечисления, будет иметь тот же тип, что и другие числовые и текстовые столбцы; Эти средства не распознают намерение и по умолчанию сопоставляют, как описано в следующих разделах "Числовое сопоставление " и "Текст" и "Сопоставление XML ". Дополнительные сведения о создании кода с помощью DBML-файла см. в разделе "Создание кода" в LINQ to SQL.

Метод DataContext.CreateDatabase создает столбец SQL числового типа для сопоставления типа CLR System.Enum.

Числовое сопоставление

LINQ to SQL позволяет отображать множество числовых типов CLR и SQL Server. В следующей таблице показаны типы CLR, которые Дизайнер O/R и SQLMetal выбирают при создании объектной модели или внешнего файла сопоставления на основе вашей базы данных.

Тип SQL Server Сопоставление типов CLR по умолчанию, используемое конструктором O/R и SQLMetal
BIT System.Boolean
TINYINT System.Int16
INT System.Int32
BIGINT System.Int64
SMALLMONEY System.Decimal
MONEY System.Decimal
DECIMAL System.Decimal
NUMERIC System.Decimal
REAL/FLOAT(24) System.Single
FLOAT/FLOAT(53) System.Double

В следующей таблице показаны соответствия типов по умолчанию, которые метод DataContext.CreateDatabase использует для определения, какие типы столбцов SQL создаются для отображения на типы CLR, определенные в вашей объектной модели или внешнем файле сопоставления.

Тип CLR Тип SQL Server по умолчанию, используемый DataContext.CreateDatabase
System.Boolean BIT
System.Byte TINYINT
System.Int16 SMALLINT
System.Int32 INT
System.Int64 BIGINT
System.SByte SMALLINT
System.UInt16 INT
System.UInt32 BIGINT
System.UInt64 DECIMAL(20)
System.Decimal DECIMAL(29,4)
System.Single REAL
System.Double FLOAT

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

Типы данных для десятичных дробей и денежных величин

Точность типа 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, которые Дизайнер O/R и SQLMetal выбирают при создании объектной модели или внешнего файла сопоставления на основе вашей базы данных.

Тип SQL Server Сопоставление типов CLR по умолчанию, используемое конструктором O/R и SQLMetal
CHAR System.String
NCHAR System.String
VARCHAR System.String
NVARCHAR System.String
TEXT System.String
NTEXT System.String
XML System.Xml.Linq.XElement

В следующей таблице показаны соответствия типов по умолчанию, которые метод DataContext.CreateDatabase использует для определения, какие типы столбцов SQL создаются для отображения на типы CLR, определенные в вашей объектной модели или внешнем файле сопоставления.

Тип CLR Тип SQL Server по умолчанию, используемый DataContext.CreateDatabase
System.Char NCHAR(1)
System.String NVARCHAR(4000)
System.Char[] NVARCHAR(4000)
Реализация пользовательского типа, включающего Parse() и ToString() NVARCHAR(MAX)

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

Типы XML

Тип данных SQL Server доступен начиная с Microsoft SQL Server XML 2005. Тип данных SQL Server XML можно сопоставить с XElement, XDocument или String. Если столбец хранит фрагменты XML, которые не могут быть прочитаны в XElement, столбец должен быть сопоставлен с String, чтобы избежать ошибок во время выполнения. Фрагменты XML, которые должны быть сопоставлены с String, включают следующие элементы:

  • Последовательность XML-элементов

  • Атрибуты

  • Общедоступные идентификаторы (PI)

  • Комментарии

Хотя вы можете сопоставить XElement и XDocument с SQL Server, как показано в матрице поведения времени выполнения сопоставления типов, DataContext.CreateDatabase метод не имеет сопоставления типов SQL Server по умолчанию для этих типов.

Пользовательские типы

Если класс реализует Parse() иToString(), можно сопоставить объект с любым текстовым типом SQL (CHAR, , NCHAR, VARCHARNVARCHAR, TEXT, NTEXT). XML Объект хранится в базе данных путем отправки значения, возвращаемого ToString() в сопоставленный столбец базы данных. Объект восстанавливается путем вызова Parse() строки, возвращаемой базой данных.

Замечание

LINQ to SQL не поддерживает сериализацию с помощью System.Xml.Serialization.IXmlSerializable.

Сопоставление даты и времени

С помощью LINQ to SQL можно сопоставить множество типов даты и времени SQL Server. В следующей таблице показаны типы CLR, которые Дизайнер O/R и SQLMetal выбирают при создании объектной модели или внешнего файла сопоставления на основе вашей базы данных.

Тип SQL Server Сопоставление типов CLR по умолчанию, используемое конструктором O/R и SQLMetal
SMALLDATETIME System.DateTime
DATETIME System.DateTime
DATETIME2 System.DateTime
DATETIMEOFFSET System.DateTimeOffset
DATE System.DateTime
TIME System.TimeSpan

В следующей таблице показаны соответствия типов по умолчанию, которые метод DataContext.CreateDatabase использует для определения, какие типы столбцов SQL создаются для отображения на типы CLR, определенные в вашей объектной модели или внешнем файле сопоставления.

Тип CLR Тип SQL Server по умолчанию, используемый DataContext.CreateDatabase
System.DateTime DATETIME
System.DateTimeOffset DATETIMEOFFSET
System.TimeSpan TIME

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

Замечание

Типы DATETIME2SQL Server , DATETIMEOFFSETDATEи TIME доступны начиная с Microsoft SQL Server 2008. 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 с параметром DateTimeKindUnspecified. Дополнительные сведения о поддерживаемых System.DateTime методах см. в разделе "Методы System.DateTime".

System.TimeSpan

Microsoft SQL Server 2008 и .NET Framework 3.5 SP1 позволяют сопоставить тип CLR System.TimeSpan с типом SQL Server TIME. Однако существует большое различие между диапазоном, поддерживаемым средой CLR System.TimeSpan , и тем, что поддерживает тип SQL Server TIME . Сопоставление значений меньше 0 или больше 23:59:59.999999999 часов с SQL TIME приведет к исключению переполнения. Дополнительные сведения см. в разделе "Методы System.TimeSpan".

В Microsoft SQL Server 2000 и SQL Server 2005 нельзя сопоставить поля базы данных с TimeSpan. Однако операции с TimeSpan поддерживаются, поскольку TimeSpan значения могут возвращаться результатом DateTime вычитания или включаться в выражение как литерал или привязанная переменная.

Двоичное отображение

Существует множество типов SQL Server, которые могут сопоставляться с типом среды CLR System.Data.Linq.Binary. В следующей таблице показаны типы SQL Server, которые заставляют конструктор O/R и SQLMetal определить тип CLR System.Data.Linq.Binary при построении объектной модели или создании внешнего файла сопоставления на основе вашей базы данных.

Тип SQL Server Сопоставление типов CLR по умолчанию, используемое конструктором O/R и SQLMetal
BINARY(50) System.Data.Linq.Binary
VARBINARY(50) System.Data.Linq.Binary
VARBINARY(MAX) System.Data.Linq.Binary
VARBINARY(MAX)с атрибутом FILESTREAM System.Data.Linq.Binary
IMAGE System.Data.Linq.Binary
TIMESTAMP System.Data.Linq.Binary

В следующей таблице показаны соответствия типов по умолчанию, которые метод DataContext.CreateDatabase использует для определения, какие типы столбцов SQL создаются для отображения на типы CLR, определенные в вашей объектной модели или внешнем файле сопоставления.

Тип CLR Тип SQL Server по умолчанию, используемый DataContext.CreateDatabase
System.Data.Linq.Binary VARBINARY(MAX)
System.Byte VARBINARY(MAX)
System.Runtime.Serialization.ISerializable VARBINARY(MAX)

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

SQL Server FILESTREAM

Атрибут FILESTREAM для столбцов VARBINARY(MAX) доступен начиная с Microsoft SQL Server 2008; его можно сопоставить с LINQ to SQL, начиная с версии 3.5 SP1 .NET Framework.

Хотя можно сопоставить столбцы VARBINARY(MAX) с объектами FILESTREAM с использованием атрибута Binary, метод DataContext.CreateDatabase сам не может автоматически создавать столбцы с атрибутом FILESTREAM. Дополнительные сведения см. в разделе FILESTREAM сведения о FILESTREAM".

Двоичная сериализация

Если класс реализует ISerializable интерфейс, можно сериализовать объект в любое двоичное поле SQL (BINARY, VARBINARY, ). IMAGE Объект сериализуется и десериализируется в соответствии с ISerializable способом реализации интерфейса. Дополнительные сведения см. в разделе "Двоичная сериализация".

Разное сопоставление

В следующей таблице показаны сопоставления типов по умолчанию для некоторых других типов, которые еще не упоминались. В следующей таблице показаны типы CLR, которые Дизайнер O/R и SQLMetal выбирают при создании объектной модели или внешнего файла сопоставления на основе вашей базы данных.

Тип SQL Server Сопоставление типов CLR по умолчанию, используемое конструктором O/R и SQLMetal
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

В следующей таблице показаны соответствия типов по умолчанию, которые метод DataContext.CreateDatabase использует для определения, какие типы столбцов SQL создаются для отображения на типы CLR, определенные в вашей объектной модели или внешнем файле сопоставления.

Тип CLR Тип SQL Server по умолчанию, используемый DataContext.CreateDatabase
System.Guid UNIQUEIDENTIFIER
System.Object SQL_VARIANT

LINQ to SQL не поддерживает никакие другие сопоставления типов для этих других типов. Дополнительные сведения см. в матрице поведения времени выполнения сопоставления типов.

См. также