Поделиться через


Устранение неполадок

Приведенные ниже сведения содержат сведения о некоторых проблемах, которые могут возникнуть в приложениях LINQ to SQL, а также рекомендации по предотвращению или уменьшению их последствий.

Дополнительные проблемы рассматриваются в разделе Часто задаваемые вопросы.

Неподдерживаемые стандартные операторы запросов

LINQ to SQL не поддерживает все стандартные методы оператора запроса (например, ElementAt). В результате компилируемых проектов могут по-прежнему возникать ошибки во время выполнения. Дополнительные сведения см. в разделе Преобразование стандартного оператора запроса.

Проблемы с использованием памяти

Если запрос включает коллекцию в памяти и LINQ to SQL Table<TEntity>, запрос может выполняться в памяти в зависимости от порядка, в котором указаны две коллекции. Если запрос следует выполнить в памяти, извлекать данные из таблицы базы данных нет необходимости.

Этот способ неэффективен и может привести к потреблению значительных ресурсов памяти и процессора. Попытайтесь исключить подобные мультидоменные запросы.

Имена файлов и средство SQLMetal

Чтобы указать имя входного файла, добавьте имя в командную строку в качестве входного файла. Включение имени файла в строку подключения (параметром /conn ) не поддерживается. Дополнительные сведения см. в разделе SQLMetal.exe (средство создания кода).

Проекты библиотеки классов

Реляционный конструктор объектов создает строку подключения в app.config файле проекта. Файл app.config не используется в проектах библиотек классов. LINQ to SQL использует строку подключения, указанную в файлах времени разработки. Изменение значения в app.config не приводит к изменениям базы данных, к которой подключается приложение.

Каскадное удаление

LINQ to SQL не поддерживает и не распознает операции каскадного удаления. Если требуется удалить строку в таблице, имеющей ограничения, необходимо выполнить любое из следующих действий.

  • Установите правило ON DELETE CASCADE в ограничении внешнего ключа в базе данных.

  • Используйте собственный код, чтобы сначала удалить дочерние объекты, не допускающие удаление родительского объекта.

В противном случае возникнет исключение SqlException.

Дополнительные сведения см. в разделе Практическое руководство. Удаление строк из базы данных.

Выражение, не подходящее для запроса

При получении ошибки «Выражение [выражение] незапрашиваемое; пропущена ссылка на сборку?» проверьте следующие условия.

  • Приложение предназначено для .NET Compact Framework 3.5.

  • Наличие ссылки на System.Core.dll и System.Data.Linq.dll.

  • У вас есть директива Imports (Visual Basic) или using (C#) для System.Linq и System.Data.Linq.

DuplicateKeyException

В ходе отладки проекта LINQ to SQL вы можете просматривать связи сущности. Это приведет к переносу этих элементов в кэш, и LINQ to SQL становится известно об их присутствии. Если после этого предпринимается попытка выполнения метода Attach, или InsertOnSubmit, или аналогичного, результатом которого являются несколько строк с одинаковым ключом, создается исключение DuplicateKeyException.

Исключения при объединении строк

Объединение в операндах, сопоставленных с [n]text и другими [n][var]char, не поддерживается. При объединении строк, сопоставленных двум разным наборам типов, возникает исключение. Дополнительные сведения см. в разделе Методы System.String.

Исключения методов "Skip" и "Take" в SQL Server 2000

При использовании IsPrimaryKey или Take в базе данных SQL Server 2000 необходимо применять члены идентификации (Skip) Запрос должен быть выполнен в одной таблице (без объединения) либо он должен представлять операцию Distinct, Except, Intersect или Union и не включать операцию Concat operation. Дополнительные сведения см. в разделе "Поддержка SQL Server 2000" статьи Перевод операторов стандартных запросов.

Это требование не распространяется на SQL Server 2005.

GroupBy InvalidOperationException

Данное исключение возникает, если в запросе GroupBy, выполняющем группировку по выражению boolean, например group x by (Phone==@phone), столбец имеет значение NULL. Так как выражение является boolean, ключ выводится booleanкак , а не nullableboolean. Когда при преобразованном сравнении возвращается значение NULL, предпринимается попытка присвоить nullablebooleanbooleanобъекту , и создается исключение.

Чтобы избежать такой ситуации (предполагается, что значения NULL оцениваются как ложные), воспользуйтесь следующим способом.

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

Разделяемый метод OnCreated()

Созданный метод OnCreated() вызывается при каждом вызове конструктора объектов, включая сценарий, в котором LINQ to SQL вызывает конструктор для создания копии исходных значений. При реализации метода OnCreated() в собственном разделяемом классе данное поведение следует принять во внимание.

См. также раздел