Udostępnij za pośrednictwem


Znane problemy w programie SqlClient dla programu Entity Framework

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

Końcowe spacje w funkcjach na ciągach znakó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 znaków, rozważ dołączenie znaku odstępu na końcu, aby SQL Server nie przycinał ciągu znaków. Jeśli spacje końcowe nie są wymagane, należy je przyciąć przed przekazaniem do potoku przetwarzania zapytań.

Funkcja RIGHT

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

Operatory PRZECIWNA i ZEWNĘTRZNA APPLY

Operatory CROSS i OUTER APPLY zostały wprowadzone w programie SQL Server 2005. W niektórych przypadkach potok zapytań może utworzyć instrukcję 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:

  • Skorelowane podzapytanie ze 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 CROSS APPLY lub OUTER APPLY

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

SKIP Operator

Jeśli używasz programu SQL Server 2000, użycie polecenia SKIP z klauzulą ORDER BY na kolumnach, które nie są kluczem, może zwracać nieprawidłowe wyniki. Więcej niż określona liczba wierszy może zostać pominięta, jeśli kolumna niekluczowa 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

Framework Entity Framework obsługuje zapytanie Transact-SQL w oparciu o wersję SQL Server, która jest określona w atrybucie ProviderManifestToken elementu Schema w pliku modelu przechowywania (.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 atrybut ProviderManifestToken jest ustawiony na wartość 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 ma wartość 2000, wygenerowane zapytanie 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ę Operatorów 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 Transact-SQL będzie przeznaczony dla programu SQL Server 2005, ale może nie zostać wykonany 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 identyfikatorów GUID generowanych przez serwer

Platforma Entity Framework obsługuje wartości tożsamości typu GUID generowane przez serwer, ale dostawca musi umożliwiać zwracanie wartości tożsamości generowanej przez serwer po dodaniu 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 także