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


Известные проблемы SqlClient для Entity Framework

В данном разделе описаны известные проблемы, связанные с поставщиком данных .NET Framework для SQL Server (SqlClient).

Конечные пробелы в строковых функциях

SQL Server игнорирует конечные пробелы в строковых значениях. Таким образом, передача конечных пробелов в строку может привести к непредсказуемым результатам и даже сбоям.

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

RIGHT, функция

Если в null, 0RIGHT(nvarchar(max) или ), 0RIGHT(varchar(max) в качестве первого аргумента передается значение, отличное от ), а в качестве второго аргумента передается значение, равное 0, то вместо строки NULL будет возвращено значение типа empty.

Операторы CROSS APPLY и OUTER APPLY

В SQL Server 2005 появились операторы CROSS и OUTER APPLY. В некоторых случаях конвейер запросов может сформировать инструкцию Transact-SQL, содержащую операторы CROSS APPLY и OUTER APPLY. Так как некоторые серверные поставщики, включая версии SQL Server ранее SQL Server 2005, не поддерживают эти операторы, такие запросы нельзя выполнять на этих серверных поставщиках.

Далее показаны некоторые стандартные сценарии, которые могут привести к появлению операторов CROSS APPLY и OUTER APPLY в выходном запросе.

  • Связанный вложенный запрос с разбиением на страницы.

  • AnyElement над коррелированным вложенным запросом или коллекцией, сформированной навигацией.

  • LINQ-запросы, использующие методы группирования, принимающие элемент selector.

  • Запрос, в котором явно указан оператор CROSS APPLY или OUTER APPLY.

  • Запрос, имеющий конструкцию DEREF над конструкцией REF.

Оператор SKIP

Если вы используете SQL Server 2000, использование SKIP с ORDER BY в столбцах, не являющихся ключевыми, может возвращать неверные результаты. Если неключевой столбец содержит повторяющиеся данные, то может быть пропущено больше указанного числа строк. Это связано с переводом SKIP для SQL Server 2000. Например, в следующем запросе может быть пропущено более пяти строк, если E.NonKeyColumn имеет повторяющиеся значения:

SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L  

Нацеливание на правильную версию SQL Server

Entity Framework предназначен для запроса Transact-SQL на основе версии SQL Server, указанной в ProviderManifestToken атрибуте элемента Schema в файле модели хранения (SSDL). Данная версия может отличаться от фактической версии SQL Server, с которой в данный момент осуществлено соединение. Например, если вы используете SQL Server 2005, но атрибут ProviderManifestToken имеет значение 2008, созданный запрос Transact-SQL может не выполняться на сервере. Например, запрос, который использует новые типы даты и времени, представленные в SQL Server 2008, не будет выполняться в предыдущих версиях SQL Server. Если вы используете SQL Server 2005, но атрибут ProviderManifestToken имеет значение 2000, созданный запрос Transact-SQL может быть менее оптимизированным, или вы можете получить исключение, которое говорит, что запрос не поддерживается. Дополнительные сведения см. в разделе «Операторы CROSS и OUTER APPLY», приведенном выше в данной теме.

Некоторые варианты поведения базы данных зависят от уровня совместимости, установленного на базе данных. ProviderManifestToken Если атрибут имеет значение 2005, а версия SQL Server — 2005, но уровень совместимости базы данных имеет значение "80" (SQL Server 2000), созданный Transact-SQL будет предназначен для SQL Server 2005, но может не выполняться должным образом из-за параметра уровня совместимости. Например, если имя столбца в списке ORDER BY совпадает с именем столбца в селекторе, то можно потерять данные об упорядочивании.

Вложенные запросы в проекции

Вложенные запросы в предложении проекции могут быть переведены в запросы декартовых произведений на сервере. На некоторых внутренних серверах, включая SQL Server, это может привести к тому, что таблица TempDB будет довольно большой. Это может снизить производительность сервера.

Далее приведен пример вложенного запроса в предложении проекции:

SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c  ) As Inner2 FROM AdventureWorksModel.JobCandidate AS c  ) As Inner1 FROM AdventureWorksModel.EmployeeDepartmentHistory AS c  

Формируемые сервером значения идентификаторов GUID

Entity Framework поддерживает значения удостоверений типа GUID, созданные сервером, но поставщик должен поддерживать возврат значения удостоверения, созданного сервером после вставки строки. Начиная с SQL Server 2005, можно вернуть созданный сервером тип GUID в базе данных SQL Server с помощью предложения OUTPUT.

См. также