Устранение неполадок (LINQ to SQL)
Обновлен: November 2007
В данном материале представлен ряд проблем, которые могут возникнуть в приложениях 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, а не как nullableboolean. Если в результате преобразованного сравнения выводится значение NULL, предпринимается попытка назначить nullableboolean для boolean и вызывается исключение.
Чтобы избежать такой ситуации (предполагается, что значения NULL оцениваются как ложные), воспользуйтесь следующим способом.
GroupBy="(Phone != null) && (Phone=@Phone)"
Разделяемый метод OnCreated()
Созданный метод OnCreated() вызывается при каждом вызове конструктора объектов, включая моменты, когда LINQ to SQL вызывает его для копирования исходных значений. При реализации метода OnCreated() в собственном разделяемом классе данное поведение следует принять во внимание.
См. также
Основные понятия
Часто задаваемые вопросы (LINQ to SQL)