Problemas conhecidos em SqlClient para Entity Framework
Esta seção descreve os problemas conhecidos relacionados ao provedor de dados. NET Framework para SQL Server (SqlClient).
Espaço à direita em funções de cadeia de caracteres
O SQL Server ignora espaço à direita nos valores de cadeia de caracteres. Portanto, passe espaço à direita na cadeia de caracteres pode levar a resultados imprevisíveis, mesmo falhas.
Se você precisa ter espaço para a direita na cadeia de caracteres, você deve considerar acrescentar um caractere de espaço em branco no final, de modo que o SQL Server não corte a cadeia de caracteres. Se o espaço à direita não são necessários, devem ser quebrados antes de serem passados abaixo do pipeline de consulta.
Função DIREITA
Se um valor denull
não é passado como um argumento e primeiros 0 são passados como um segundo argumento para RIGHT(nvarchar(max)
, 0)
ou RIGHT(varchar(max)
, 0)
, um valor de NULL
serão retornados em vez de uma cadeia de caracteres de empty
.
A CRUZ e EXTERIORES APLICAM operadores
Os operadores CROSS e OUTER APPLY foram introduzidos no SQL Server 2005. Em alguns casos o pipeline de consulta pode gerar uma declaração de Transact-SQL que contém a CRUZ SE APLICASSE e/ou OUTER APPLY operadores. Porque alguns provedores back-end, incluindo versões do SQL Server anteriores ao SQL Server 2005, não dão suporte para esses operadores, essas consultas podem não ser executadas nesses provedores back-end.
A seguir estão alguns cenários típicos que podem resultar na presença de CRUZ SE APLICAM e/ou OUTER APPLY operadores na consulta de saída:
Um subconsulta correlacionado com paginação.
AnyElement
sobre subpropriedades uma consulta correlacionada, ou sobre uma coleção gerada por navegação.LINQ consulta que uso que agrupa os métodos que aceitam um seletor do elemento.
Uma consulta em que uma CRUZ SE APLICA ou OUTER APPLY são especificados explicitamente
Uma consulta que tenha uma compilação de DEREF sobre uma compilação de referência.
Operador SKIP
Se você estiver usando o SQL Server 2000, usar a SKIP com cláusula ORDER BY em colunas não chave poderá retornar resultados incorretos. Mais do que o número de linhas especificado podem ser ignoradas se a coluna de chave não tem dados duplicados nele. Isso se deve a como SKIP é convertido para o SQL Server 2000. Por exemplo, a seguinte consulta, mais de cinco linhas podem ser ignoradas se E.NonKeyColumn
tem valores duplicados:
SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L
Direcionamento a versão correta do SQL Server
O Entity Framework se destina a consulta Transact-SQL com base na versão do SQL Server especificada no atributo ProviderManifestToken
do elemento de esquema no arquivo de modelo de armazenamento (.ssdl). Esta versão pode diferir de versão do SQL Server que você real é conectada. Se você estiver usando o SQL Server 2005, mas seu atributo ProviderManifestToken
estiver definido como 2008, a consulta Transact-SQL gerada poderá não ser executada no servidor. Por exemplo, uma consulta que usa os novos tipos de data e tempo introduzidos no SQL Server 2008 não será executado em versões anteriores do SQL Server. Se você estiver usando o SQL Server 2005, mas seu atributo ProviderManifestToken
estiver definido como 2000, a consulta do Transact-SQL gerada poderá ser menos ser otimizada ou você poderá receber uma exceção que diga que não há suporte para a consulta. Para obter mais informações, consulte a CRUZ e OUTER APLICA a seção dos operadores, anteriormente neste tópico.
Determinados comportamentos de base de dados depende de nível de compatibilidade definido para base de dados. Se o atributo de ProviderManifestToken
é definido como 2005 e sua versão do SQL Server é 2005, mas a compatibilidade em nível de um banco de dados é definida como “80 " (SQL Server 2000), o Transact-SQL gerado terá como alvo o SQL Server 2005, mas poderá não ser executado como esperado devido à configuração de nível de compatibilidade. Por exemplo, você pode perder ordenação informações se um nome de coluna na cláusula ORDER a lista corresponde a um nome de coluna no seletor.
Consultas aninhadas na projeção
Consultas aninhadas em uma cláusula de projeção podem obter convertido em consultas de produto cartesiano no servidor. Em alguns servidor de back-end, incluindo o SQL Server, isso pode fazer com que a tabela TempDB seja bastante grande. Isso pode diminuir o desempenho do servidor.
Veja a seguir um exemplo de uma consulta aninhada em uma cláusula de projeção:
SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c ) As Inner2 FROM AdventureWorksModel.JobCandidate AS c ) As Inner1 FROM AdventureWorksModel.EmployeeDepartmentHistory AS c
Valores gerados a identidade do GUID de servidor
O Entity Framework dá suporte para valores gerados o a identidade do tipo de GUID, mas o provedor deve dar suporte a retornar o valor de identidade gerado pelo servidor depois de uma linha ser inserida. Do SQL Server 2005 em diante, você pode retornar o tipo GUID gerado pelo servidor em um banco de dados do SQL Server por meio da cláusula OUTPUT.