Solução de problemas

As seguintes informações expostas alguns problemas que você pode encontrar em seus aplicativos do LINQ to SQL, e oferece sugestões para evitar ou reduzir de outra maneira o efeito desses problemas.

Problemas adicionais são abordados em Perguntas Frequentes.

Operadores padrões sem suporte de consulta

O LINQ to SQL não dá suporte a todos os métodos do operador de consulta padrão (por exemplo, ElementAt). Como resultado, os projetos que compilam ainda podem gerar erros em tempo de execução. Para obter mais informações, consulte Tradução do operador de consulta padrão.

Problemas de memória

Se uma consulta envolve uma coleção de memória e o LINQ to SQL Table<TEntity>, a consulta pode ser executada na memória, como a ordem em que as duas coleções são especificadas. Se a consulta deve ser executada na memória, os dados da tabela de base de dados deverão ser recuperados.

Essa abordagem é ineficiente e pode resultar em uso significativa de memória e do processador. Tente evitar esses consultas do domínio.

Nomes de arquivo e SQLMetal

Para especificar um nome do arquivo de entrada, adicione o nome do arquivo à linha de comando como o arquivo de entrada. Não há suporte para a inclusão do nome de 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 de biblioteca de classe

O Object Relational Designer cria uma cadeia de conexão no arquivo app.config do projeto. Em projetos de biblioteca de classes, o arquivo de app.config não é usado. O LINQ to SQL usa a cadeia de conexão fornecida nos arquivos de tempo de design. Altere o valor em app.config não altera a base de dados que conecta seu aplicativo.

Excluir em cascata

O LINQ to SQL não dá suporte a nem reconhece operações de exclusão em cascata. Se você deseja excluir uma linha em uma tabela que possui restrições nele, você deve fazer:

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

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

Se não, uma exceção é lançada de SqlException .

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

Expressão não Queryable

Se você obtém a “expressão [a expressão] > é não questionável; é que você não possui uma referência de montagem?” o erro, certifique-se do seguinte:

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

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

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

DuplicateKeyException

Durante a depuração de um projeto do LINQ to SQL, você pode percorrer as relações de uma entidade. Fazer isso traz esses itens para o cache e o LINQ to SQL fica ciente da presença deles. Se você tentar então executar Attach ou InsertOnSubmit ou método semelhante que gerencia as várias linhas que têm a mesma chave, DuplicateKeyException é lançada.

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

Concatenação em operandos mapeou a [n]text e o outro [n][var]char não é suportado. Uma exceção é lançada para concatenação de cadeias de caracteres mapeadas para dois conjuntos de diferentes tipos. Para obter mais informações, consulte Métodos System.String.

Ignore e tome exceções no SQL Server 2000

Você deve usar membros de identidade (IsPrimaryKey) quando você usa Take ou Skip em um base de dados SQL Server 2000. A consulta deve estar com uma única tabela (isto é, não uma união), ou seja Distinct, Except, Intersect, ou operação de Union , e não deve incluir uma operação de Concat . Para obter mais informações, consulte a seção "Suporte do SQL Server 2000" em Tradução do operador de consulta padrão.

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

GroupBy InvalidOperationException

Essa exceção é lançada quando um valor de coluna é zero em uma consulta de GroupBy que se agrupe por uma expressão de boolean , como group x by (Phone==@phone). Devido à expressão ser um boolean, a chave é inferida como sendo boolean, e não nullableboolean. Quando a comparação traduzida gerencia um nulo, uma tentativa é feita para atribuir um nullableboolean a um boolean, e a exceção é gerada.

Para evitar essa situação (pressupõe que o desejar tratar nulos como false), use uma abordagem como o seguinte:

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

Método parcial deOnCreated()

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

Confira também