Freigeben über


Problembehandlung (LINQ to SQL)

Aktualisiert: November 2007

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 FAQ (Häufig gestellte Fragen) zu LINQ to SQL behandelt.

Nicht unterstützte Standardabfrageoperatoren

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

Arbeitsspeicherprobleme

Wenn eine Abfrage sowohl eine speicherinterne Auflistung 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 Auflistungen 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 (unter Verwendung der /conn-Option) wird nicht unterstützt. Weitere Informationen finden Sie unter Tool zur Codegenerierung (SqlMetal.exe).

Klassenbibliotheksprojekte

O/R-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.

Kaskadierte Löschung

Kaskadierte Löschvorgänge werden von LINQ to SQL nicht unterstützt bzw. 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 Gewusst wie: Löschen von Zeilen aus der Datenbank (LINQ to SQL).

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:

  • Die Anwendung muss auf .NET Compact Framework 3.5 abzielen.

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

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

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 (LINQ to SQL).

Überspringen und Behandeln von Ausnahmen in SQL Server 2000

Bei Verwendung von Take<TSource> oder Skip<TSource> für eine SQL Server 2000-Datenbank müssen Identitätsmember (IsPrimaryKey) verwendet werden. Die Abfrage muss gegen eine einzelne Tabelle (keine Verknüpfung) ausgeführt werden oder einen der Vorgänge Distinct, Except, Intersect oder Union darstellen und darf keinen Concat<TSource>-Vorgang beinhalten. Weitere Informationen finden Sie im Abschnitt "SQL Server 2000-Unterstützung" unter Übersetzen von Standardabfrageoperatoren (LINQ to SQL).

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, sobald 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

Konzepte

FAQ (Häufig gestellte Fragen) zu LINQ to SQL

Weitere Ressourcen

Debuggingunterstützung (LINQ to SQL)