Устранение неполадок (LINQ to SQL)

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

Решение других проблем рассматривается в разделе Часто задаваемые вопросы (LINQ to SQL).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Дополнительные сведения см. в разделе Как удалять строки из базы данных (LINQ to SQL).

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

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

  • Приложение предназначено для выполнения в .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 (LINQ to SQL).

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

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

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

GroupBy InvalidOperationException

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

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

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

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

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

См. также

Основные понятия

Часто задаваемые вопросы (LINQ to SQL)

Другие ресурсы

Поддержка отладки (LINQ to SQL)