Partilhar via


Resolução de problemas

As seguintes informações expõem alguns problemas que poderá encontrar nas suas aplicações LINQ to SQL e fornecem sugestões para evitar ou reduzir o efeito destes problemas.

Os problemas adicionais são resolvidos nas Perguntas Mais Frequentes.

Operadores de Consulta Standard Não Suportados

LINQ to SQL não suporta todos os métodos de operador de consulta padrão (por exemplo, ElementAt). Como resultado, os projetos que compilam ainda podem produzir erros de tempo de execução. Para obter mais informações, veja Tradução do Operador de Consulta Padrão.

Problemas de Memória

Se uma consulta envolver uma coleção dentro da memória e LINQ to SQLTable<TEntity>, a consulta poderá ser executada na memória, consoante a ordem pela qual as duas coleções são especificadas. Se a consulta tiver de ser executada na memória, os dados da tabela da base de dados terão de ser obtidos.

Esta abordagem é ineficiente e pode resultar numa utilização significativa da memória e do processador. Tente evitar tais consultas de vários domínios.

Nomes de Ficheiros e SQLMetal

Para especificar um nome de ficheiro de entrada, adicione o nome à linha de comandos como o ficheiro de entrada. A inclusão do nome do ficheiro na cadeia de ligação (com a opção /conn ) não é suportada. Para obter mais informações, veja SqlMetal.exe (Ferramenta de Geração de Código).

Projetos de Biblioteca de Turmas

O Estruturador Relacional de Objetos cria uma cadeia de ligação no app.config ficheiro do projeto. Em projetos de biblioteca de classes, o app.config ficheiro não é utilizado. LINQ to SQL utiliza a Cadeia de Ligação fornecida nos ficheiros de tempo de estrutura. Alterar o valor em app.config não altera a base de dados à qual a aplicação se liga.

Eliminação em Cascata

LINQ to SQL não suporta nem reconhece operações de eliminação em cascata. Se pretender eliminar uma linha numa tabela que tenha restrições, tem de efetuar um dos seguintes procedimentos:

  • Defina a ON DELETE CASCADE regra na restrição de chave externa na base de dados.

  • Utilize o seu próprio código para eliminar primeiro os objetos subordinados que impedem que o objeto principal seja eliminado.

Caso contrário, é emitida uma SqlException exceção.

Para obter mais informações, consulte Como: Eliminar Linhas da Base de Dados.

Expressão Não Consultada

Se receber a mensagem "Expressão [expressão] não pode ser consultada; Está a perder uma referência de assemblagem?" erro, certifique-se do seguinte:

  • A sua aplicação tem como destino o .NET Compact Framework 3.5.

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

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

DuplicateKeyException

No decorrer da depuração de um projeto LINQ to SQL, pode percorrer as relações de uma entidade. Ao fazê-lo, estes itens são colocados na cache e LINQ to SQL fica ciente da sua presença. Se, em seguida, tentar executar Attach ou InsertOnSubmit um método semelhante que produz várias linhas que têm a mesma chave, é emitido um DuplicateKeyException .

Exceções de Concatenação de Cadeias

A concatenação em operandos mapeados e [n]text outros [n][var]char não é suportada. É emitida uma exceção para a concatenação de cadeias mapeadas para os dois conjuntos de tipos diferentes. Para obter mais informações, veja Métodos System.String.

Ignorar e Tomar Exceções no SQL Server 2000

Tem de utilizar membros de identidade (IsPrimaryKey) quando utiliza Take ou Skip numa base de dados SQL Server 2000. A consulta tem de estar numa única tabela (ou seja, não numa associação) ou ser uma Distinctoperação , Except, Intersectou Union e não deve incluir uma Concat operação. Para obter mais informações, veja a secção "Suporte SQL Server 2000" na Tradução do Operador de Consulta Standard.

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

GroupBy InvalidOperationException

Esta exceção é emitida quando um valor de coluna é nulo numa GroupBy consulta que agrupa por uma boolean expressão, como group x by (Phone==@phone). Uma vez que a expressão é um boolean, a chave é inferida como boolean, não nullableboolean. Quando a comparação traduzida produz um valor nulo, é feita uma tentativa de atribuir um nullableboolean a um booleane a exceção é emitida.

Para evitar esta situação (partindo do princípio de que pretende tratar os nulos como falsos), utilize uma abordagem como a seguinte:

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

Método Parcial OnCreated()

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

Ver também