Rozwiązywanie problemów
Poniższe informacje uwidacznia niektóre problemy, które mogą wystąpić w aplikacjach LINQ to SQL, i zawierają sugestie, aby uniknąć lub w inny sposób zmniejszyć efekt tych problemów.
Dodatkowe problemy są rozwiązywane w często zadawanych pytaniach.
Nieobsługiwane standardowe operatory zapytań
LINQ to SQL nie obsługuje wszystkich standardowych metod operatorów zapytań (na przykład ElementAt). W związku z tym projekty kompilowane mogą nadal generować błędy czasu wykonywania. Aby uzyskać więcej informacji, zobacz Standardowe tłumaczenie operatorów zapytań.
Problemy z pamięcią
Jeśli zapytanie obejmuje kolekcję w pamięci i LINQ to SQL Table<TEntity>, zapytanie może być wykonywane w pamięci, w zależności od kolejności, w której określono dwie kolekcje. Jeśli zapytanie musi być wykonywane w pamięci, należy pobrać dane z tabeli bazy danych.
Takie podejście jest nieefektywne i może spowodować znaczne użycie pamięci i procesora. Staraj się unikać takich zapytań obejmujących wiele domen.
Nazwy plików i SQLMetal
Aby określić nazwę pliku wejściowego, należy dodać ją do wiersza polecenia jako plik wejściowy. Uwzględnienie nazwy pliku w parametrach połączenia (przy użyciu opcji /conn ) nie jest obsługiwane. Aby uzyskać więcej informacji, zobacz SqlMetal.exe (narzędzie generowania kodu).
Projekty biblioteki klas
Object Relational Designer tworzy parametry połączenia w app.config
pliku projektu. W projektach app.config
biblioteki klas plik nie jest używany. LINQ to SQL używa parametrów połączenia podanych w plikach czasu projektowania. Zmiana wartości w app.config
pliku nie powoduje zmiany bazy danych, z którą łączy się aplikacja.
Usuwanie kaskadowe
LINQ to SQL nie obsługuje ani nie rozpoznaje operacji usuwania kaskadowego. Jeśli chcesz usunąć wiersz w tabeli z ograniczeniami, musisz wykonać jedną z następujących czynności:
Ustaw regułę
ON DELETE CASCADE
w ograniczeniu klucza obcego w bazie danych.Użyj własnego kodu, aby najpierw usunąć obiekty podrzędne, które uniemożliwiają usunięcie obiektu nadrzędnego.
W przeciwnym razie zgłaszany SqlException jest wyjątek.
Aby uzyskać więcej informacji, zobacz How to: Delete Rows From the Database (Instrukcje: usuwanie wierszy z bazy danych).
Wyrażenie nie można wykonywać zapytań
Jeśli zostanie wyświetlony komunikat "Wyrażenie [wyrażenie] nie jest możliwe do wykonywania zapytań; Czy brakuje odwołania do zestawu?" — błąd, upewnij się, że są spełnione następujące kwestie:
Aplikacja jest przeznaczona dla platformy .NET Compact Framework 3.5.
Masz odwołanie do i
System.Core.dll
System.Data.Linq.dll
.Masz dyrektywę
Imports
(Visual Basic) lubusing
(C#) dla System.Linq elementów i System.Data.Linq.
Duplicatekeyexception
W trakcie debugowania projektu LINQ to SQL można przechodzić relacje jednostki. Dzięki temu te elementy są wprowadzane do pamięci podręcznej, a LINQ to SQL staje się świadomy ich obecności. Jeśli następnie spróbujesz wykonać Attach polecenie lub InsertOnSubmit podobną metodę, która generuje wiele wierszy z tym samym kluczem DuplicateKeyException , zostanie zgłoszony błąd .
Wyjątki łączenia ciągów
Łączenie na operandach mapowanych na [n]text
i inne [n][var]char
nie jest obsługiwane. Wyjątek jest zgłaszany w celu łączenia ciągów mapowanych na dwa różne zestawy typów. Aby uzyskać więcej informacji, zobacz Metody System.String.
Pomiń wyjątki i weź je w SQL Server 2000
Należy używać elementów członkowskich tożsamości (IsPrimaryKey) w przypadku używania Take lub Skip względem bazy danych SQL Server 2000. Zapytanie musi być względem pojedynczej tabeli (czyli nie sprzężenia) lub być operacją Distinct, Except, Intersectlub Union operacją Concat i nie może zawierać operacji. Aby uzyskać więcej informacji, zobacz sekcję "obsługa SQL Server 2000" w temacie Standardowe tłumaczenie operatora zapytań.
To wymaganie nie dotyczy SQL Server 2005 r.
GroupBy InvalidOperationException
Ten wyjątek jest zgłaszany, gdy wartość kolumny ma wartość null w GroupBy zapytaniu, które grupuje według boolean
wyrażenia, takiego jak group x by (Phone==@phone)
. Ponieważ wyrażenie jest wyrażeniem boolean
, klucz jest wnioskowany jako boolean
, a nie nullable
boolean
. Gdy przetłumaczone porównanie generuje wartość null, jest podejmowana próba przypisania nullable
boolean
elementu do boolean
elementu , a wyjątek jest zgłaszany.
Aby uniknąć tej sytuacji (przy założeniu, że chcesz traktować wartości null jako false), użyj podejścia takiego jak:
GroupBy="(Phone != null) && (Phone=@Phone)"
OnCreated() Partial, metoda
Wygenerowana metoda OnCreated()
jest wywoływana za każdym razem, gdy wywoływany jest konstruktor obiektu, w tym scenariusz, w którym LINQ to SQL wywołuje konstruktora, aby utworzyć kopię oryginalnych wartości. To zachowanie należy wziąć pod uwagę, jeśli zaimplementujesz metodę OnCreated()
we własnej klasie częściowej.