Udostępnij za pośrednictwem


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.dllSystem.Data.Linq.dll.

  • Masz dyrektywę Imports (Visual Basic) lub using (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 nullableboolean. Gdy przetłumaczone porównanie generuje wartość null, jest podejmowana próba przypisania nullableboolean elementu do booleanelementu , 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.

Zobacz też