Sdílet prostřednictvím


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.

Viz také