Az SqlClient entitás-keretrendszerének ismert problémái

Ez a szakasz az SQL Serverhez készült .NET-keretrendszer adatszolgáltatójának (SqlClient) ismert problémáit ismerteti.

Sztringfüggvények záró szóközei

Az SQL Server figyelmen kívül hagyja a sztringértékek záró szóközeit. Ezért a sztring végén található szóközök átadása kiszámíthatatlan eredményekhez, akár hibákhoz is vezethet.

Ha záró szóközökre van szüksége a sztringben, fontolja meg egy üres szóköz karakter hozzáfűzését a végén, hogy az SQL Server ne vágja le a sztringet. Ha a záró szóközökre nincs szükség, meg kell vágni őket, mielőtt átadnák őket a lekérdezési csővezetéknek.

RIGHT függvény

Ha egy nem-null értéket ad át első argumentumként, és a 0 értéket második argumentumként adja át RIGHT(nvarchar(max)-nek, 0)-nek vagy RIGHT(varchar(max), 0)-nek, egy NULL értéket ad vissza empty sztring helyett.

CROSS és OUTER APPLY operátorok

AZ SQL Server 2005-ben bevezettük a CROSS és az OUTER APPLY operátorokat. Bizonyos esetekben a lekérdezési csatorna egy Transact-SQL utasítást hozhat létre, amely CROSS APPLY és/vagy OUTER APPLY operátorokat tartalmaz. Mivel egyes háttérszolgáltatók, köztük az SQL Server 2005-nél korábbi SQL Server-verziók nem támogatják ezeket az operátorokat, ezek a lekérdezések nem hajthatók végre ezeken a háttérszolgáltatókon.

Az alábbiakban néhány tipikus forgatókönyvet követünk, amelyek kereszt-APPLY és/vagy OUTER APPLY operátorok jelenlétéhez vezethetnek a kimeneti lekérdezésben:

  • Korrelált részlekérdezés lapozással.

  • Egy AnyElement korrelált al-lekérdezés felett vagy egy navigáció által létrehozott gyűjtemény felett.

  • OLYAN LINQ-lekérdezések, amelyek elemválasztót elfogadó csoportosítási metódusokat használnak.

  • Olyan lekérdezés, amelyben explicit módon meg van adva a CROSS APPLY vagy az OUTER APPLY

  • Olyan lekérdezés, amely DEREF-szerkezettel rendelkezik egy REF-szerkezeten keresztül.

SKIP operátor

Ha SQL Server 2000-et használ, előfordulhat, hogy a SKIP és az ORDER BY nem kulcsos oszlopokon való használata helytelen eredményeket ad vissza. A megadott számú sornál több kihagyható, ha a nem kulcs oszlopban ismétlődő adatok találhatók. Ennek az az oka, hogy a SKIP hogyan lesz lefordítva az SQL Server 2000-hez. A következő lekérdezésben például több mint öt sor kihagyható, ha E.NonKeyColumn ismétlődő értékek vannak:

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

A megfelelő SQL Server-verzió célzása

Az Entity Framework a Transact-SQL lekérdezést célozza meg a tárolási modell (.ssdl) fájl sémaelemének attribútumában ProviderManifestToken megadott SQL Server-verzió alapján. Ez a verzió eltérhet a tényleges SQL Server verziójától, amelyhez csatlakozik. Ha például SQL Server 2005-öt használ, de az ProviderManifestToken attribútum értéke 2008, előfordulhat, hogy a létrehozott Transact-SQL lekérdezés nem fut a kiszolgálón. Az SQL Server 2008-ban bevezetett új dátumidőtípusokat használó lekérdezések például nem lesznek végrehajtva az SQL Server korábbi verzióiban. Ha SQL Server 2005-öt használ, de az ProviderManifestToken attribútum értéke 2000, a létrehozott Transact-SQL lekérdezés kevésbé lesz optimalizálva, vagy kivételt kaphat, amely szerint a lekérdezés nem támogatott. További információt az e témakör korábbi részében található KERESZT és KÜLSŐ ALKALMAZ operátorok című szakaszában talál.

Bizonyos adatbázis-viselkedések az adatbázishoz beállított kompatibilitási szinttől függenek. Ha az ProviderManifestToken attribútum értéke 2005, az SQL Server verziója pedig 2005, de az adatbázis kompatibilitási szintje "80" (SQL Server 2000), a létrehozott Transact-SQL az SQL Server 2005-öt célozza, de a kompatibilitási szint beállítása miatt előfordulhat, hogy nem a várt módon fut. Előfordulhat például, hogy a rendelési adatok elvesznek, ha az ORDER BY listában egy oszlopnév megegyezik a választó oszlopnevével.

Beágyazott lekérdezések a kivetítésben

A vetítési záradékban lévő beágyazott lekérdezések a kiszolgálón található Cartesian-terméklekérdezésekre fordíthatók le. Egyes háttérkiszolgálókon, például az SQL Serveren ez a TempDB-tábla nagy méretűre fordulását okozhatja. Ez csökkentheti a kiszolgáló teljesítményét.

Az alábbi példa egy beágyazott lekérdezésre egy előrejelzési záradékban:

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  

Kiszolgáló által létrehozott GUID-identitásértékek

Az Entity Framework támogatja a kiszolgáló által létrehozott GUID típusú identitásértékeket, de a szolgáltatónak támogatnia kell a kiszolgáló által létrehozott identitásérték visszaadását egy sor beszúrása után. Az SQL Server 2005-től kezdve a KISZOLGÁLÓ által generált GUID-típust az SQL Server-adatbázisban az OUTPUT záradékon keresztül lehet visszaadni.

Lásd még