Dela via


Kända problem i SqlClient för Entity Framework

I det här avsnittet beskrivs kända problem som rör .NET Framework Data Provider för SQL Server (SqlClient).

Avslutande blanksteg i strängfunktioner

SQL Server ignorerar avslutande blanksteg i strängvärden. Därför kan att skicka avslutande blanksteg i strängen leda till oförutsägbara resultat, till och med fel.

Om du behöver ha avslutande blanksteg i din sträng, kan du överväga att lägga till ett mellanslag i slutet, så att SQL Server inte skär bort strängen. Om de avslutande blankstegen inte krävs bör de trimmas innan de skickas vidare till frågepipelinen.

RIGHT-funktion

Om ett icke-värdenull skickas som ett första argument och 0 skickas som ett andra argument till RIGHT(nvarchar(max), 0) eller RIGHT(varchar(max), 0), returneras ett NULL värde i stället för en empty sträng.

CROSS- och OUTER APPLY-operatorer

CROSS- och OUTER APPLY-operatorer introducerades i SQL Server 2005. I vissa fall kan frågepipelinen skapa en Transact-SQL-instruktion som innehåller CROSS APPLY- och/eller OUTER APPLY-operatorer. Eftersom vissa serverdelsproviders, inklusive versioner av SQL Server tidigare än SQL Server 2005, inte stöder dessa operatorer, kan sådana frågor inte köras på dessa serverdelsproviders.

Följande är några typiska scenarier som kan leda till förekomst av CROSS APPLY- och/eller OUTER APPLY-operatorer i utdatafrågan:

  • En korrelerad underfråga med sidindelning.

  • En AnyElement över en korrelerad underfråga eller över en samling som skapats av navigeringen.

  • LINQ-frågor som använder grupperingsmetoder som accepterar en elementväljare.

  • En fråga där en CROSS APPLY eller en OUTER APPLY uttryckligen anges

  • En sökfråga som använder en DEREF-konstruktion över en REF-konstruktion.

Skipoperator

Om du använder SQL Server 2000 kan det returnera felaktiga resultat genom att använda SKIP med ORDER BY på icke-nyckelkolumner. Fler än det angivna antalet rader kan hoppas över om kolumnen som inte är nyckel innehåller duplicerade data. Detta beror på hur SKIP översätts för SQL Server 2000. I följande förfrågan kan fler än fem rader hoppas över om E.NonKeyColumn har duplicerade värden.

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

Rikta in sig på rätt SQL Server-version

Entity Framework riktar sig mot den Transact-SQL frågan baserat på SQL Server-versionen som anges i ProviderManifestToken attributet för schemaelementet i lagringsmodellens fil (.ssdl). Den här versionen kan skilja sig från den version av den faktiska SQL Server som du är ansluten till. Om du till exempel använder SQL Server 2005, men attributet ProviderManifestToken är inställt på 2008, kanske den genererade Transact-SQL frågan inte körs på servern. En fråga som använder de nya datumtidstyperna som introducerades i SQL Server 2008 körs till exempel inte på tidigare versioner av SQL Server. Om du använder SQL Server 2005, men attributet ProviderManifestToken är inställt på 2000, kan den genererade Transact-SQL frågan vara mindre optimerad, eller så kan du få ett undantag som säger att frågan inte stöds. Mer information finns i avsnittet om CROSS- och OUTER APPLY-operatorer tidigare i det här ämnet.

Vissa databasbeteenden beror på den kompatibilitetsnivå som angetts till databasen. Om attributet ProviderManifestToken är inställt på 2005 och SQL Server-versionen är 2005, men kompatibilitetsnivån för en databas är inställd på "80" (SQL Server 2000), kommer den genererade Transact-SQL att riktas mot SQL Server 2005, men kanske inte körs som förväntat på grund av kompatibilitetsnivåinställningen. Du kan till exempel förlora ordningsinformation om ett kolumnnamn i ORDER BY-listan matchar ett kolumnnamn i en väljare.

Kapslade frågor i projektion

Kapslade frågor i en projektionssats kan översättas till kartesiska produktfrågor på servern. På vissa back-end-servrar, inklusive SQL Server, kan detta göra att TempDB-tabellen blir ganska stor. Detta kan minska serverprestandan.

Följande är ett exempel på en kapslad fråga i en projektionssats:

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  

Servergenererade GUID-identitetsvärden

Entity Framework stöder servergenererade GUID-typidentitetsvärden, men providern måste ha stöd för att returnera det servergenererade identitetsvärdet efter att en rad infogats. Från och med SQL Server 2005 kan du returnera den servergenererade GUID-typen i en SQL Server-databas via UTDATA-satsen.

Se även