Problembehandlung

Wichtig

Verwenden Sie System.Data.SqlClient nicht für neue Entwicklungen. Verwenden Sie Microsoft. Data.SqlClient für neuen SQL Server Datenzugriffscode. Das anbieterspezifische Verhalten auf dieser Seite stammt aus dem integrierten LINQ to SQL-Anbieter von .NET Framework, der System.Data.SqlClient erfordert. Durch das Ändern des Verbindungstyps allein wird LINQ zu SQL nicht migriert.

Die folgenden Informationen zeigen einige Probleme auf, die in Ihren LINQ to SQL-Anwendungen auftreten können, und bieten Vorschläge, um die Auswirkungen dieser Probleme zu vermeiden oder zu verringern.

Weitere Probleme werden in häufig gestellten Fragen behandelt.

Nicht unterstützte Standardabfrageoperatoren

LINQ to SQL unterstützt nicht alle Standardmäßigen Abfrageoperatormethoden (z. B ElementAt. ). Daher können Projekte, die kompiliert werden, weiterhin Laufzeitfehler erzeugen. Weitere Informationen finden Sie unter "Standard Query Operator Translation".

Speicherprobleme

Wenn eine Abfrage eine In-Memory-Auflistung und LINQ to SQL Table<TEntity>umfasst, wird die Abfrage möglicherweise im Arbeitsspeicher ausgeführt, abhängig von der Reihenfolge, in der die beiden Auflistungen angegeben werden. Wenn die Abfrage im Arbeitsspeicher ausgeführt werden muss, müssen die Daten aus der Datenbanktabelle abgerufen werden.

Dieser Ansatz ist ineffizient und kann zu erheblicher Arbeitsspeicher- und Prozessorauslastung führen. Versuchen Sie, solche Abfragen mit mehreren Domänen zu vermeiden.

Dateinamen und SQLMetal

Um einen Namen für eine Eingabedatei anzugeben, fügen Sie den Namen der Befehlszeile als Eingabedatei hinzu. Das Einschließen des Dateinamens in die Verbindungszeichenfolge (mit der Option "/conn ") wird nicht unterstützt. Weitere Informationen finden Sie unter SqlMetal.exe (Codegenerierungstool).

Klassenbibliotheksprojekte

Der objektrelationale Designer erstellt eine Verbindungszeichenfolge in der app.config Datei des Projekts. In Klassenbibliotheksprojekten wird die app.config Datei nicht verwendet. LINQ to SQL verwendet die in den Entwurfszeitdateien bereitgestellte Verbindungszeichenfolge. Das Ändern des Werts in app.config ändert nicht die Datenbank, mit der Ihre Anwendung eine Verbindung herstellt.

Kaskadierendes Delete

LINQ to SQL unterstützt oder erkennt keine Kaskadenlöschvorgänge. Wenn Sie eine Zeile in einer Tabelle löschen möchten, die Einschränkungen dafür enthält, müssen Sie eine der folgenden Aktionen ausführen:

  • Legen Sie die ON DELETE CASCADE Regel in der Fremdschlüsseleinschränkung in der Datenbank fest.

  • Verwenden Sie Ihren eigenen Code, um zuerst die untergeordneten Objekte zu löschen, die verhindern, dass das übergeordnete Objekt gelöscht wird.

Andernfalls wird eine SqlException Ausnahme ausgelöst.

Weitere Informationen finden Sie unter How to: Delete Rows From the Database.

Ausdruck nicht abfragbar

Falls der Fehler „Der Ausdruck [Ausdruck] kann nicht abgefragt werden. Möglicherweise fehlt ein Assemblyverweis“ auftritt, stellen Sie Folgendes sicher:

  • Ihre Anwendung zielt auf das .NET Compact Framework 3.5 ab.

  • Sie haben einen Verweis auf System.Core.dll und System.Data.Linq.dll.

  • Sie verfügen über eine Imports (Visual Basic) oder using (C#)-Direktive für System.Linq und System.Data.Linq.

DuplicateKeyException

Im Verlauf des Debuggens eines LINQ to SQL-Projekts können Sie die Beziehungen einer Entität durchlaufen. Dadurch werden diese Elemente in den Cache gebracht, und LINQ to SQL erkennt ihre Anwesenheit. Wenn Sie dann versuchen, Attach oder InsertOnSubmit oder eine ähnliche Methode, die mehrere Zeilen mit demselben Schlüssel erzeugt, auszuführen, wird eine DuplicateKeyException ausgelöst.

Ausnahmen bei der Zeichenfolgenverkettung

Verkettung für Operanden, die [n]text zugeordnet sind, und andere [n][var]char werden nicht unterstützt. Eine Ausnahme wird für die Verkettung von Zeichenfolgen ausgelöst, die den beiden verschiedenen Typengruppen zugeordnet sind. Weitere Informationen finden Sie unter System.String-Methoden.

Überspringen und Behandeln von Ausnahmen in SQL Server 2000

Bei Verwendung von IsPrimaryKey oder Take für eine SQL Server 2000-Datenbank müssen Identitätsmember (Skip) verwendet werden. Die Abfrage muss für eine einzelne Tabelle (d. h. keine Verknüpfung) sein, oder ein Vorgang Distinct, Except, Intersect oder Union und darf keinen Vorgang Concat enthalten. Weitere Informationen finden Sie im Abschnitt "SQL Server 2000-Unterstützung" in der Standardabfrageoperatorübersetzung.

Diese Anforderung gilt nicht für SQL Server 2005.

GroupBy InvalidOperationException

Diese Ausnahme wird ausgelöst, wenn ein Spaltenwert in einer GroupBy-Abfrage null ist, die nach einem boolean-Ausdruck gruppiert wird, z. B. group x by (Phone==@phone). Da der Ausdruck ein boolean ist, wird der Schlüssel zu boolean abgeleitet, nicht nullableboolean. Wenn der übersetzte Vergleich NULL ergibt, wird versucht, boolean den Wert nullableboolean zuzuweisen, und die Ausnahme wird ausgelöst.

Um diese Situation zu vermeiden (vorausgesetzt, Sie möchten Nullen als falsch behandeln), verwenden Sie einen Ansatz wie die folgenden:

GroupBy="(Phone != null) && (Phone=@Phone)"

OnCreated() Teilweise Methode

Die generierte Methode OnCreated() wird jedes Mal aufgerufen, wenn der Objektkonstruktor aufgerufen wird, einschließlich des Szenarios, in dem LINQ to SQL den Konstruktor aufruft, um eine Kopie für originale Werte zu erstellen. Berücksichtigen Sie dieses Verhalten, wenn Sie die OnCreated() Methode in Ihrer eigenen partiellen Klasse implementieren.

Siehe auch