Známé problémy v SqlClient pro Entity Framework
Tato část popisuje známé problémy související s rozhraním .NET Framework Zprostředkovatel dat pro SQL Server (SqlClient).
Koncové mezery ve funkcích řetězců
SQL Server ignoruje koncové mezery v řetězcových hodnotách. Proto předání koncových mezer v řetězci může vést k nepředvídatelným výsledkům, a to i selháním.
Pokud musíte mít v řetězci koncové mezery, měli byste zvážit připojení prázdného znaku na konci, aby SQL Server neořízl řetězec. Pokud koncové mezery nejsou povinné, měly by být před předáním kanálu dotazu oříznuté.
FUNKCE RIGHT
Pokud se nehodnocenull
předá jako první argument a hodnota 0 se předá jako druhý argument RIGHT(nvarchar(max)
, 0)
nebo RIGHT(varchar(max)
, 0)
, NULL
vrátí se hodnota místo empty
řetězce.
Operátory CROSS a OUTER APPLY
Operátory CROSS a OUTER APPLY byly zavedeny v SYSTÉMU SQL Server 2005. V některých případech může kanál dotazu vytvořit příkaz Transact-SQL, který obsahuje operátory CROSS APPLY nebo OUTER APPLY. Vzhledem k tomu, že někteří poskytovatelé back-endu, včetně verzí SQL Serveru starších než SQL Server 2005, nepodporují tyto operátory, tyto dotazy nelze na těchto back-endových poskytovatelích spustit.
Následuje několik typických scénářů, které můžou vést k přítomnosti operátorů CROSS APPLY a/nebo OUTER APPLY ve výstupním dotazu:
Korelovaný poddotaz se stránkováním
Nad
AnyElement
korelovaným dílčím dotazem nebo kolekcí vytvořenou pomocí navigace.LinQ dotazy, které používají metody seskupení, které přijímají selektor elementu.
Dotaz, ve kterém je explicitně zadán křížový příkaz APPLY nebo VNĚJŠÍ POUŽITÍ
Dotaz, který má konstruktor DEREF nad konstruktorem REF.
SKIP – operátor
Pokud používáte SQL Server 2000, použití funkce SKIP s ORDER BY u sloupců, které nejsou klíči, může vrátit nesprávné výsledky. Pokud sloupec, který není klíč, obsahuje duplicitní data, může být přeskočeno více než zadaný počet řádků. Důvodem je překlad funkce SKIP pro SQL Server 2000. Například v následujícím dotazu může být přeskočeno více než pět řádků, pokud E.NonKeyColumn
má duplicitní hodnoty:
SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L
Cílení na správnou verzi SQL Serveru
Entity Framework cílí na dotaz Transact-SQL na základě verze SQL Serveru, která je určena v ProviderManifestToken
atributu prvku Schématu v souboru modelu úložiště (.ssdl). Tato verze se může lišit od verze skutečného SQL Serveru, ke kterému jste připojení. Pokud například používáte SQL Server 2005, ale váš ProviderManifestToken
atribut je nastavený na 2008, vygenerovaný dotaz Transact-SQL se nemusí na serveru spustit. Například dotaz, který používá nové typy data a času, které byly zavedeny v SYSTÉMU SQL Server 2008, se nespustí ve starších verzích SQL Serveru. Pokud používáte SQL Server 2005, ale váš ProviderManifestToken
atribut je nastavený na 2000, vygenerovaný dotaz Transact-SQL může být méně optimalizovaný nebo můžete získat výjimku, která říká, že dotaz není podporovaný. Další informace naleznete v oddílu CROSS and OUTER APPLY Operators výše v tomto tématu.
Určité chování databáze závisí na úrovni kompatibility nastavené na databázi. Pokud je atribut ProviderManifestToken
nastavený na 2005 a vaše verze SQL Serveru je 2005, ale úroveň kompatibility databáze je nastavena na hodnotu 80 (SQL Server 2000), vygenerovaný jazyk Transact-SQL bude cílit na SQL Server 2005, ale nemusí se spustit podle očekávání kvůli nastavení úrovně kompatibility. Pokud například název sloupce v seznamu ORDER BY odpovídá názvu sloupce v selektoru, může dojít ke ztrátě informací o řazení.
Vnořené dotazy v projekci
Vnořené dotazy v klauzuli projekce můžou být přeloženy do kartézských dotazů produktu na serveru. Na některých back-endových serverech, včetně SQL Serveru, to může způsobit, že tabulka TempDB bude poměrně velká. To může snížit výkon serveru.
Následuje příklad vnořeného dotazu v klauzuli projekce:
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
Hodnoty identity vygenerované serverem GUID
Entity Framework podporuje hodnoty identity typu GUID generované serverem, ale zprostředkovatel musí podporovat vrácení hodnoty identity generované serverem po vložení řádku. Počínaje SQL Serverem 2005 můžete vrátit typ GUID vygenerovaný serverem v databázi SQL Serveru prostřednictvím klauzule OUTPUT.