Bekannte Probleme in SqlClient für Entity Framework

In diesem Abschnitt werden bekannte Probleme im Zusammenhang mit dem .NET Framework-Datenanbieter für SQL Server (SqlClient) beschrieben.

Nachfolgende Leerzeichen in Zeichenfolgenfunktionen

SQL Server ignoriert nachstehende Leerzeichen in Zeichenfolgenwerten. Deshalb kann die Übergabe von nachfolgenden Leerzeichen in der Zeichenfolge zu unvorhersehbaren Ergebnissen und sogar zu Fehlern führen.

Wenn nachstehende Leerzeichen in der Zeichenfolge unumgänglich sind, sollten Sie am Ende ein Leerraumzeichen hinzufügen, sodass SQL Server die Zeichenfolge nicht kürzt. Wenn die nachfolgenden Leerzeichen nicht benötigt werden, sollten sie vor der Übergabe an die Abfragepipeline abgetrennt werden.

RIGHT-Funktion

Wenn ein Wert, der nicht null ist, als erstes Argument und 0 als zweites Argument an RIGHT(nvarchar(max), 0) oder RIGHT(varchar(max), 0) übergeben wird, wird der Wert NULL anstelle einer Zeichenfolge, die empty ist, zurückgegeben.

CROSS- und OUTER APPLY-Operatoren

CROSS- und OUTER APPLY-Operatoren wurden in SQL Server 2005 eingeführt. In einigen Fällen liefert die Abfragepipeline möglicherweise eine Transact-SQL-Anweisung, die CROSS APPLY- und/oder OUTER APPLY-Operatoren enthält. Da einige Back-End-Anbieter, einschließlich Versionen von SQL Server vor SQL Server 2005, diese Operatoren nicht unterstützen, können solche Abfragen nicht auf diesen Back-End-Anbietern ausgeführt werden.

Dies sind einige typische Szenarios, die möglicherweise zum Auftreten von CROSS APPLY- und/oder OUTER APPLY-Operatoren in der Ausgabeabfrage führen:

  • Eine korrelierte Unterabfrage mit Paging.

  • Ein AnyElement über einer korrelierten Unterabfrage oder über einer von der Navigation erzeugten Auflistung.

  • LINQ-Abfragen, in denen Gruppierungsmethoden verwendet werden, die einen Elementselektor akzeptieren.

  • Eine Abfrage, in der ein CROSS APPLY oder ein OUTER APPLY explizit angegeben wird

  • Eine Abfrage, die über ein DEREF-Konstrukt über einem REF-Konstrukt verfügt.

SKIP-Operator

Wenn Sie SQL Server 2000 verwenden, führt die Verwendung von SKIP mit ORDER BY auf Nichtschlüsselspalten möglicherweise zur Rückgabe falscher Ergebnisse. Es kann vorkommen, dass mehr als die angegebene Anzahl von Zeilen übersprungen wird, wenn die Nichtschlüsselspalte Daten doppelt enthält. Der Grund dafür ist die Übersetzung von SKIP für SQL Server 2000. In der folgenden Abfrage können beispielsweise mehr als fünf Zeilen übersprungen werden, wenn E.NonKeyColumn doppelte Werte enthält:

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

Verwenden der richtigen SQL Server-Version

Das Entity Framework verarbeitet die Transact-SQL-Abfrage auf Grundlage der SQL Server-Version, die im Attribut ProviderManifestToken des Schemaelements in der Speichermodelldatei (SSDL) angegeben ist. Diese Version unterscheidet sich möglicherweise von der tatsächlichen SQL Server-Version, mit der Sie verbunden sind. Wenn Sie beispielsweise SQL Server 2005 verwenden, aber das Attribut ProviderManifestToken auf 2008 festgelegt ist, wird die generierte Transact-SQL-Abfrage möglicherweise nicht auf dem Server ausgeführt. Beispielsweise wird eine Abfrage, in der die in SQL Server 2008 eingeführten neuen Datums-/Zeittypen verwendet werden, nicht auf früheren Versionen von SQL Server ausgeführt. Wenn Sie SQL Server 2005 verwenden, das Attribut ProviderManifestToken jedoch auf 2000 festgelegt ist, ist die generierte Transact-SQL-Abfrage möglicherweise weniger optimiert, oder es wird eine Ausnahme ausgelöst, die besagt, dass die Abfrage nicht unterstützt wird. Weitere Informationen finden Sie oben im Abschnitt über die CROSS- und OUTER APPLY-Operatoren.

Bestimmte Datenbankverhaltensweisen hängen vom festgelegten Kompatibilitätsgrad der Datenbank ab. Wenn das Attribut ProviderManifestToken auf 2005 festgelegt ist und Sie über die SQL Server-Version 2005 verfügen, der Kompatibilitätsgrad einer Datenbank jedoch auf „80“ (SQL Server 2000) festgelegt ist, zielt die erzeugte Transact-SQL-Abfrage zwar auf SQL Server 2005 ab, wird aber aufgrund der Einstellung für den Kompatibilitätsgrad möglicherweise nicht wie erwartet ausgeführt. Zum Beispiel geht möglicherweise die Sortierung verloren, wenn ein Spaltenname in der ORDER BY-Liste einem Spaltennamen im Selektor entspricht.

Geschachtelte Abfragen in Projektion

Geschachtelte Abfragen in einer Projektionsklausel könnten auf dem Server in Abfragen des kartesischen Produkts übersetzt werden. Auf einigen Back-End-Servern, einschließlich SQL Server, kann dies zu einer sehr großen TempDB-Tabelle führen. Dies kann die Serverleistung beeinträchtigen.

Im Folgenden sehen Sie ein Beispiel für eine geschachtelte Abfrage in einer Projektionsklausel:

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  

Servergenerierte GUID-Identitätswerte

Das Entity Framework unterstützt servergenerierte GUID-Typidentitätswerte, aber der Anbieter muss die Rückgabe von servergenerierten Identitätswerten nach dem Einfügen einer Zeile unterstützen. Ab SQL Server 2005 können Sie den servergenerierten GUID-Typ in einer SQL Server-Datenbank über die OUTPUT-Klausel zurückgeben.

Siehe auch