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.