Compartilhar via


Resolução de problemas

As informações a seguir expõem alguns problemas que você pode encontrar em seu LINQ para aplicativos SQL e fornece sugestões para evitar ou reduzir o efeito desses problemas.

Problemas adicionais são resolvidos em perguntas frequentes.

Operadores de consulta padrão sem suporte

LINQ to SQL não dá suporte a todos os métodos de operador de consulta padrão (por exemplo, ElementAt). Como resultado, os projetos compilados ainda podem produzir erros de runtime. Para obter mais informações, consulte Tradução do Operador de Consulta Padrão.

Problemas de memória

Se uma consulta envolver uma coleção na memória e LINQ to SQL Table<TEntity>, a consulta poderá ser executada na memória, dependendo da ordem na qual as duas coleções são especificadas. Se a consulta precisar ser executada na memória, os dados da tabela de banco de dados precisarão ser recuperados.

Essa abordagem é ineficiente e pode resultar em um uso significativo de memória e processador. Tente evitar essas consultas de vários domínios.

Nomes de arquivo e SQLMetal

Para especificar um nome de arquivo de entrada, adicione o nome à linha de comando como o arquivo de entrada. Não há suporte para incluir o nome do arquivo na cadeia de conexão (usando a opção /conn ). Para obter mais informações, consulte SqlMetal.exe (Ferramenta de Geração de Código).

Projetos da Biblioteca de Classes

O Designer Relacional de Objeto cria uma cadeia de conexão no app.config arquivo do projeto. Em projetos de biblioteca de classes, o app.config arquivo não é usado. LINQ to SQL usa a cadeia de conexão fornecida nos arquivos de design-time. Alterar o valor app.config não altera o banco de dados ao qual seu aplicativo se conecta.

Exclusão em cascata

O LINQ to SQL não dá suporte nem reconhece operações de exclusão em cascata. Se você quiser excluir uma linha em uma tabela que tenha restrições contra ela, deverá fazer um dos seguintes procedimentos:

  • Defina a ON DELETE CASCADE regra na restrição de chave estrangeira no banco de dados.

  • Use seu próprio código para primeiro excluir os objetos filho que impedem que o objeto pai seja excluído.

Caso contrário, uma SqlException exceção será gerada.

Para obter mais informações, consulte Como excluir linhas do banco de dados.

Expressão não passível de consulta

Se você receber o erro "Expressão [expressão] não é consultável; está faltando uma referência de assembly?", verifique o seguinte:

  • Seu aplicativo tem como destino o .NET Compact Framework 3.5.

  • Você tem uma referência a System.Core.dll e System.Data.Linq.dll.

  • Você tem uma diretiva Imports (Visual Basic) ou using (C#) para System.Linq e System.Data.Linq.

DuplicateKeyException

Durante o processo de depuração de um projeto LINQ a SQL, você pode percorrer as relações de uma entidade. Isso traz esses itens para o cache e o LINQ para SQL se torna consciente de sua presença. Se você tentar executar Attach ou InsertOnSubmit um método semelhante que produz várias linhas que tenham a mesma chave, uma DuplicateKeyException será lançada.

Exceções de concatenação de cadeia de caracteres

Não há suporte para concatenação de operandos mapeados para [n]text e outros [n][var]char. Uma exceção é gerada para concatenação de cadeias de caracteres mapeadas para os dois conjuntos diferentes de tipos. Para obter mais informações, consulte Métodos System.String.

Ignorar e tirar exceções no SQL Server 2000

Você deve usar membros de identidade (IsPrimaryKey) ao usar Take ou Skip em um banco de dados do SQL Server 2000. A consulta deve estar em uma única tabela (ou seja, não uma junção) ou ser uma Distinct, Except, Intersectou Union operação, e não deve incluir uma Concat operação. Para obter mais informações, consulte a seção "Suporte do SQL Server 2000" na Tradução do Operador de Consulta Padrão.

Esse requisito não se aplica ao SQL Server 2005.

Exceção de Operação Inválida de Agrupar

Essa exceção é gerada quando um valor de coluna é nulo em uma GroupBy consulta que agrupa por uma boolean expressão, como group x by (Phone==@phone). Como a expressão é um boolean, a chave é inferida para ser boolean, não nullableboolean. Quando a comparação traduzida produz um valor nulo, é feita uma tentativa de atribuir um nullableboolean a um boolean e a exceção é gerada.

Para evitar essa situação (supondo que você queira tratar nulos como falso), use uma abordagem como esta:

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

Método Parcial OnCreated()

O método OnCreated() gerado é chamado sempre que o construtor de objeto é chamado, incluindo o cenário em que LINQ to SQL chama o construtor para fazer uma cópia para valores originais. Leve esse comportamento em conta se você implementar o método OnCreated() em sua própria classe parcial.

Consulte também