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. Att skicka avslutande blanksteg i strängen kan därför leda till oförutsägbara resultat, till och med fel.

Om du måste ha avslutande blanksteg i strängen bör du överväga att lägga till ett blankstegstecken i slutet, så att SQL Server inte trimmar 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 växling.

  • 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 fråga som har en DEREF-konstruktion över en REF-konstruktion.

SKIP-operator

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 fråga kan till exempel fler än fem rader hoppas över om E.NonKeyColumn det finns 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 Transact-SQL-frågan baserat på SQL Server-versionen som anges i ProviderManifestToken attributet för schemaelementet i lagringsmodellfilen (.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 CROSS- och OUTER APPLY-operatorer tidigare i det här avsnittet.

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 inställningen för kompatibilitetsnivå. Du kan till exempel förlora ordningsinformation om ett kolumnnamn i LISTAN ORDER BY matchar ett kolumnnamn i väljaren.

Kapslade frågor i projektion

Kapslade frågor i en projektionssats kan översättas till kartesiska produktfrågor på servern. På vissa serverdelsservrar, 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