Bekende problemen in SqlClient voor Entity Framework
In deze sectie worden bekende problemen beschreven met betrekking tot de .NET Framework-gegevensprovider voor SQL Server (SqlClient).
Volgspaties in tekenreeksfuncties
SQL Server negeert volgspaties in tekenreekswaarden. Daarom kan het doorgeven van volgspaties in de tekenreeks leiden tot onvoorspelbare resultaten, zelfs fouten.
Als u volgspaties in de tekenreeks moet hebben, moet u overwegen om aan het einde een witruimteteken toe te voegen, zodat sql Server de tekenreeks niet trimt. Als de volgspaties niet vereist zijn, moeten ze worden ingekort voordat ze worden doorgegeven aan de querypijplijn.
RECHTS, functie
Als een niet-waardenull
wordt doorgegeven als een eerste argument en 0 wordt doorgegeven als een tweede argument aan RIGHT(nvarchar(max)
, 0)
of RIGHT(varchar(max)
, 0)
, wordt een NULL
waarde geretourneerd in plaats van een empty
tekenreeks.
OPERATORS CROSS en OUTER APPLY
CROSS- en OUTER APPLY-operators zijn geïntroduceerd in SQL Server 2005. In sommige gevallen kan de querypijplijn een Transact-SQL-instructie produceren die CROSS APPLY- en/of OUTER APPLY-operators bevat. Omdat sommige back-endproviders, waaronder versies van SQL Server ouder dan SQL Server 2005, deze operators niet ondersteunen, kunnen dergelijke query's niet worden uitgevoerd op deze back-endproviders.
Hier volgen enkele typische scenario's die kunnen leiden tot de aanwezigheid van CROSS APPLY- en/of OUTER APPLY-operators in de uitvoerquery:
Een gecorreleerde subquery met paging.
Een
AnyElement
over een gecorreleerde subquery of over een verzameling die wordt geproduceerd door navigatie.LINQ-query's die gebruikmaken van groeperingsmethoden die een elementkiezer accepteren.
Een query waarin een CROSS APPLY of een OUTER APPLY expliciet is opgegeven
Een query met een DEREF-constructie boven een REF-constructie.
SKIP-operator
Als u SQL Server 2000 gebruikt, kan het gebruik van SKIP met ORDER BY in niet-sleutelkolommen onjuiste resultaten opleveren. Meer dan het opgegeven aantal rijen kan worden overgeslagen als de kolom zonder sleutel dubbele gegevens bevat. Dit komt doordat SKIP wordt vertaald voor SQL Server 2000. In de volgende query kunnen bijvoorbeeld meer dan vijf rijen worden overgeslagen als E.NonKeyColumn
er dubbele waarden zijn:
SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L
Gericht op de juiste SQL Server-versie
Entity Framework is gericht op de Transact-SQL-query op basis van de SQL Server-versie die is opgegeven in het ProviderManifestToken
kenmerk van het schema-element in het opslagmodelbestand (.ssdl). Deze versie kan afwijken van de versie van de werkelijke SQL Server met wie u bent verbonden. Als u bijvoorbeeld SQL Server 2005 gebruikt, maar uw ProviderManifestToken
kenmerk is ingesteld op 2008, wordt de gegenereerde Transact-SQL-query mogelijk niet uitgevoerd op de server. Een query die gebruikmaakt van de nieuwe datum/tijdtypen die zijn geïntroduceerd in SQL Server 2008, wordt bijvoorbeeld niet uitgevoerd in eerdere versies van DE SQL Server. Als u SQL Server 2005 gebruikt, maar uw ProviderManifestToken
kenmerk is ingesteld op 2000, is de gegenereerde Transact-SQL-query mogelijk minder geoptimaliseerd of krijgt u een uitzondering met de mededeling dat de query niet wordt ondersteund. Zie de sectie CROSS en OUTER APPLY Operators eerder in dit onderwerp voor meer informatie.
Bepaald databasegedrag is afhankelijk van het compatibiliteitsniveau dat is ingesteld op de database. Als uw ProviderManifestToken
kenmerk is ingesteld op 2005 en uw SQL Server-versie 2005 is, maar het compatibiliteitsniveau van een database is ingesteld op '80' (SQL Server 2000), is de gegenereerde Transact-SQL gericht op SQL Server 2005, maar wordt mogelijk niet uitgevoerd zoals verwacht vanwege de instelling van het compatibiliteitsniveau. U kunt bijvoorbeeld bestelgegevens verliezen als een kolomnaam in de lijst ORDER BY overeenkomt met een kolomnaam in de selector.
Geneste query's in projectie
Geneste query's in een projectiecomponent kunnen worden vertaald in cartesische productquery's op de server. Op sommige back-endservers, waaronder SQL Server, kan dit ertoe leiden dat de TempDB-tabel behoorlijk groot wordt. Dit kan de serverprestaties verminderen.
Hier volgt een voorbeeld van een geneste query in een projectiecomponent:
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
Door de server gegenereerde GUID-identiteitswaarden
Entity Framework ondersteunt door de server gegenereerde identiteitswaarden van het GUID-type, maar de provider moet ondersteuning bieden voor het retourneren van de door de server gegenereerde identiteitswaarde nadat een rij is ingevoegd. Vanaf SQL Server 2005 kunt u het door de server gegenereerde GUID-type in een SQL Server-database retourneren via de OUTPUT-component.