Problembehandlung

Die folgenden Informationen beziehen sich auf Probleme, die in LINQ to SQL-Anwendungen auftreten können, und enthalten Vorschläge dazu, wie diese Probleme vermieden bzw. deren Auswirkungen auf andere Weise verringert werden können.

Weitere Probleme werden in den häufig gestellten Fragen behandelt.

Nicht unterstützte Standardabfrageoperatoren

LINQ to SQL unterstützt nicht alle Standardabfrageoperator-Methoden (z. B. ElementAt). Folglich können Projekte, die kompiliert werden, immer noch Laufzeitfehler verursachen. Weitere Informationen finden Sie unter Übersetzen von Standardabfrageoperatoren.

Arbeitsspeicherprobleme

Wenn eine Abfrage sowohl eine speicherinterne Sammlung als auch LINQ to SQL-Table<TEntity> enthält, wird die Ausführung u. U. im Arbeitsspeicher ausgeführt. Dies hängt davon ab, in welcher Reihenfolge die beiden Sammlungen angegeben sind. Wenn die Abfrage im Arbeitsspeicher ausgeführt werden muss, müssen die Daten aus der Datenbanktabelle abgerufen werden.

Dieser Ansatz ist ineffizient und könnte zu einem erheblichen Anstieg der Arbeitsspeicher- und Prozessornutzung führen. Versuchen Sie, derartige Abfragen über mehrere 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. Die Angabe des Dateinamens in der Verbindungszeichenfolge (mithilfe der Option /conn ) wird nicht unterstützt. Weitere Informationen finden Sie unter SqlMetal.exe (Tool zur Codegenerierung).

Klassenbibliotheksprojekte

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

Kaskadierendes Delete

Kaskadierte Löschvorgänge werden von LINQ to SQL weder unterstützt noch erkannt. Wenn Sie eine Zeile in einer Tabelle löschen möchten, für die Einschränkungen gelten, führen Sie eines der folgenden Verfahren aus:

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

  • Verwenden Sie eigenen Code, um zunächst die untergeordneten Objekte zu löschen, die das Löschen des übergeordneten Objekts verhindern.

Andernfalls wird eine SqlException-Ausnahme ausgelöst.

Weitere Informationen finden Sie unter Vorgehensweise: Löschen von Zeilen aus der Datenbank.

Ausdruck kann nicht abgefragt werden

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

  • Ihre Anwendung ist auf .NET Compact Framework 3.5 ausgerichtet.

  • Sie müssen über einen Verweis auf System.Core.dll und System.Data.Linq.dll verfügen.

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

DuplicateKeyException

Beim Debuggen eines LINQ to SQL-Projekts kann es vorkommen, dass die Beziehungen einer Entität durchlaufen werden. Dadurch werden diese Elemente in den Cache eingefügt und von LINQ to SQL erkannt. Wenn Sie dann versuchen, Attach oder InsertOnSubmit bzw. eine ähnliche Methode auszuführen, durch die mehrere Zeilen mit demselben Schlüssel generiert werden, wird eine DuplicateKeyException ausgelöst.

Ausnahmen bei der Zeichenfolgenverkettung

Die Verkettung von Operanden, die [n]text zugeordnet sind, und anderen, die [n][var]char zugeordnet sind, wird nicht unterstützt. Bei der Verkettung von Zeichenfolgen, die zwei verschiedenen Typsätzen zugeordnet sind, wird eine Ausnahme ausgelöst. 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 gegen eine einzelne Tabelle (keinen Join) ausgeführt werden oder einen der Vorgänge Distinct, Except, Intersect oder Union darstellen und darf keinen Concat-Vorgang beinhalten. Weitere Informationen finden Sie im Abschnitt „SQL Server 2000-Unterstützung“ unter Übersetzen von Standardabfrageoperatoren.

Diese Anforderung gilt nicht für SQL Server 2005.

GroupBy InvalidOperationException

Diese Ausnahme wird ausgelöst, wenn ein Spaltenwert in einer GroupBy-Abfrage, die eine Gruppierung nach einem boolean-Ausdruck ausführt, z. B. group x by (Phone==@phone), NULL ist. Da der Ausdruck boolean ist, wird davon ausgegangen, dass der Schlüssel boolean und nicht nullableboolean ist. 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, NULL soll als false behandelt werden), verwenden Sie eine Lösung wie die folgende:

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

OnCreated() (Partielle Methode)

Die generierte OnCreated()-Methode wird jedes Mal aufgerufen, wenn der Objektkonstruktor aufgerufen wird, beispielsweise auch dann, wenn LINQ to SQL den Konstruktor aufruft, um eine Kopie für ursprüngliche Werte zu erstellen. Sie sollten dieses Verhalten berücksichtigen, wenn Sie die OnCreated()-Methode in einer eigenen partiellen Klasse implementieren.

Siehe auch