Udostępnij za pośrednictwem


Znane problemy klienta SQL dla programu Entity Framework

W tej sekcji opisano znane problemy związane z programem .NET Framework Dostawca danych dla programu SQL Server (SqlClient).

Końcowe spacje w funkcjach ciągów

Program SQL Server ignoruje końcowe spacje w wartościach ciągów. W związku z tym przekazywanie spacji końcowych w ciągu może prowadzić do nieprzewidywalnych wyników, nawet błędów.

Jeśli musisz mieć spacje końcowe w ciągu, należy rozważyć dołączenie znaku odstępu na końcu, aby program SQL Server nie przycinał ciągu. Jeśli spacje końcowe nie są wymagane, należy je przyciąć przed przekazaniem potoku zapytania.

RIGHT, funkcja

Jeśli wartość nienull jest przekazywana jako pierwszy argument, a wartość 0 jest przekazywana jako drugi argument do RIGHT(nvarchar(max), 0) lub RIGHT(varchar(max), 0), NULL wartość zostanie zwrócona zamiast empty ciągu.

Operatory CROSS i OUTER APPLY

Operatory CROSS i OUTER APPLY zostały wprowadzone w programie SQL Server 2005. W niektórych przypadkach potok zapytania może utworzyć instrukcję Języka Transact-SQL zawierającą operatory CROSS APPLY i/lub OUTER APPLY. Ponieważ niektórzy dostawcy zaplecza, w tym wersje programu SQL Server wcześniejsze niż SQL Server 2005, nie obsługują tych operatorów, takie zapytania nie mogą być wykonywane dla tych dostawców zaplecza.

Poniżej przedstawiono niektóre typowe scenariusze, które mogą prowadzić do obecności operatorów CROSS APPLY i/lub OUTER APPLY w zapytaniu wyjściowym:

  • Skorelowana podzapytywanie z stronicowaniem.

  • Za AnyElement pośrednictwem skorelowanego zapytania podrzędnego lub kolekcji utworzonej przez nawigację.

  • Zapytania LINQ korzystające z metod grupowania, które akceptują selektor elementów.

  • Zapytanie, w którym jawnie określono ZASTOSOWANIE KRZYŻOWE lub ZASTOSOWANIE ZEWNĘTRZNE

  • Zapytanie, które ma konstrukcję DEREF na konstrukcji REF.

SKIP Operator

Jeśli używasz programu SQL Server 2000, użycie polecenia SKIP z kolumnami innych niż klucz może zwracać nieprawidłowe wyniki. Więcej niż określona liczba wierszy może zostać pominięta, jeśli kolumna niekluczy zawiera zduplikowane dane. Wynika to z tego, jak funkcja SKIP jest tłumaczona dla programu SQL Server 2000. Na przykład w poniższym zapytaniu więcej niż pięć wierszy może zostać pominiętych, jeśli E.NonKeyColumn ma zduplikowane wartości:

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

Określanie wartości docelowej prawidłowej wersji programu SQL Server

Program Entity Framework jest przeznaczony dla zapytania Języka Transact-SQL opartego na wersji programu SQL Server określonej w ProviderManifestToken atrybucie elementu Schema w pliku modelu magazynu (ssdl). Ta wersja może różnić się od wersji rzeczywistego programu SQL Server, z którym masz połączenie. Jeśli na przykład używasz programu SQL Server 2005, ale ProviderManifestToken atrybut jest ustawiony na 2008, wygenerowane zapytanie Transact-SQL może nie być wykonywane na serwerze. Na przykład zapytanie korzystające z nowych typów daty i godziny, które zostały wprowadzone w programie SQL Server 2008, nie będzie wykonywane we wcześniejszych wersjach programu SQL Server. Jeśli używasz programu SQL Server 2005, ale atrybut ProviderManifestToken jest ustawiony na 2000, wygenerowane zapytanie Języka Transact-SQL może być mniej zoptymalizowane lub może zostać wyświetlony wyjątek informujący, że zapytanie nie jest obsługiwane. Aby uzyskać więcej informacji, zobacz sekcję CROSS and OUTER APPLY Operators (Operatory CROSS i OUTER APPLY) we wcześniejszej części tego tematu.

Niektóre zachowania bazy danych zależą od poziomu zgodności ustawionego na bazę danych. ProviderManifestToken Jeśli atrybut jest ustawiony na 2005, a wersja programu SQL Server to 2005, ale poziom zgodności bazy danych ma wartość "80" (SQL Server 2000), wygenerowany język Transact-SQL będzie przeznaczony dla programu SQL Server 2005, ale może nie być wykonywany zgodnie z oczekiwaniami ze względu na ustawienie poziomu zgodności. Na przykład możesz utracić informacje o kolejności, jeśli nazwa kolumny na liście ORDER BY jest zgodna z nazwą kolumny w selektorze.

Zapytania zagnieżdżone w projekcji

Zapytania zagnieżdżone w klauzuli projekcji mogą zostać przetłumaczone na zapytania produktów kartezjańskich na serwerze. Na niektórych serwerach zaplecza, w tym na serwerze SQL Server, może to spowodować, że tabela TempDB stanie się dość duża. Może to zmniejszyć wydajność serwera.

Poniżej przedstawiono przykład zagnieżdżonego zapytania w klauzuli projekcji:

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  

Wartości tożsamości wygenerowanego przez serwer

Platforma Entity Framework obsługuje wartości tożsamości typu GUID wygenerowanego przez serwer, ale dostawca musi obsługiwać zwracanie wartości tożsamości wygenerowanej przez serwer po wstawieniu wiersza. Począwszy od programu SQL Server 2005, można zwrócić typ identyfikatora GUID wygenerowanego przez serwer w bazie danych programu SQL Server za pomocą klauzuli OUTPUT.

Zobacz też