Бөлісу құралы:


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

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

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

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

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

ФУНКЦИЯ RIGHT

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

Операторы CROSS и 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, использующие методы группировки, принимающие селектор элементов.

  • Запрос, в котором явно указывается 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.

См. также