2010-02-25 10 views
5

estoy usando Entity Framework con MySQL. La siguiente consulta da como resultado un error:EXTERIOR aplican no es soportado por MySQL

var foobar = ctx.ArticleBase.OfType<ActicleSpecial>().Include("CreatedBy.Image.Location").ToList(); 

de error: "OUTER APPLY no es compatible con MySQL" también consigo el "CROSS APPLY no es compatible con MySQL" en una pequeña consulta diferente.

Tengo el siguiente modelo de datos: alt text http://i48.tinypic.com/5x4kdc.jpg

Excepto la entidad de imagen tienen entidad Ubicación (relación de uno a muchos) llamado Localización relación y UserBase tienen relación con la imagen en lugar de UserSpecial.

¿Por qué aparece este error? ¿Cómo evitar este error? ¿Es posible?

+0

no es soportado por Oracle o bien :( – gbjbaanb

+0

1 para los gráficos – thomaspaulb

Respuesta

3

Si este error proviene de MySQL una de dos cosas han sucedido:

  1. No ha configurado correctamente el proveedor.
  2. Hay un error en su proveedor de EF.

Si este error proviene de su proveedor de MySQL EF, a continuación, una de dos cosas han sucedido:

  1. No ha configurado correctamente el proveedor.
  2. Existe una limitación en su proveedor de EF.

SQL se genera por el proveedor. Puede configurar la generación de SQL específica de la versión del servidor a través del ProviderManifestToken attribute in EDMX. Así es como le dices al proveedor que no use funciones de SQL que las versiones de servidores anteriores no admiten.

Es posible que algunos motores de almacenamiento MySQL sean compatibles con funciones de SQL que otros no. En este caso, el proveedor necesitaría usar un subconjunto común de características admitidas por la mayoría de los motores o usar ProviderManifestToken para permitirle elegir.

Sin embargo, también es posible que un proveedor con errores simplemente devuelva SQL incorrecto. Si este es el caso, entonces debe encontrar una actualización o evitar las consultas que toquen el error.

Actualización: Según la respuesta de @ Devart, parece que esto es una limitación del proveedor, que está diseñado debido a las limitaciones de MySQL. El EF producirá un árbol de comandos canónicos de ADO.NET. Es responsabilidad del proveedor traducir esto a SQL. Si el EF devuelve un nodo cross/outer apply en el CCT, parece que Devart no ha encontrado una forma de traducir esto a SQL que MySQL pueda manejar. Entonces, MySQL simplemente no está a la altura de la tarea de respaldar todas las consultas de EF, o alguien que es un experto de MySQL (¡no yo!) Necesita mostrarle a Devart cómo producir SQL compatible con MySQL que pueda devolver filas para la aplicación cross/outer Nodos CCT

+0

Lo sentimos, Craig, usted está equivocado. Esto no es ni error de configuración, ni el error en el proveedor de MySQL EF. – Devart

+0

Por favor, lea el artículo que Vinculado. Dice no tal cosa. –

+2

Aquí hay una cita: "En algunos casos, la canalización de consultas podría producir una instrucción Transact-SQL que contenga operadores CROSS APPLY y OUTER APPLY. Debido a que algunos proveedores backend, incluyendo versiones de SQL Server anteriores a SQL Server 2005, no admitir estos operadores, tales consultas no se pueden ejecutar en estos proveedores backend ". Este es el caso de Peter. Nos habíamos contactado con Microsoft sobre este tema y la respuesta fue negativa: esta funcionalidad no se cambiará. – Devart

3

Esta es una característica de arquitectura interna de Entity Framework. A veces genera consultas no compatibles con proveedores que no sean SQL Server. Más información está disponible here at MSDN.

+1

Eso está mal. El artículo que vincula describe "Problemas conocidos en el proveedor de datos de .NET Framework ** para SQL Server (SqlClient) ** para Entity Framework)." (Énfasis agregado). El hecho simple es que ** toda la generación de ** SQL en el EF la realiza el proveedor, * no * el EF en sí mismo. –

+0

Entonces, ¿qué es verdad? Si el proveedor genera un SQL, obviamente hay un error en su proveedor de MySQL. ¿Por qué entonces utiliza Cross Apply u Outer Apply con MySQL? ¿Cómo debería escribir una consulta para evitar este problema? ¿Tengo que configurar algo en el conector Devart? –

+3

SQL se genera a partir del árbol de expresiones proporcionado por la canalización de consulta de EF. Si el árbol ya contiene APLICACIÓN EXTERIOR, no hay forma de deshacerse de él en el proveedor. – Devart

Cuestiones relacionadas