Бөлісу құралы:


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

Приведенные ниже сведения предоставляют некоторые проблемы, которые могут возникнуть в приложениях 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".

Пропуск и выполнение исключений в SQL Server 2000

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

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

GroupBy исключение InvalidOperationException

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

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

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

Частичный метод OnCreated()

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

См. также