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