Hoy toca una de cal con Entity Framework 4. Y es que trabajar con un entorno de desarrollo distinto del que luego te puedes encontrar en producción tiene su riesgo (que levante la mano cuántos tienen instalado Visual Studio sobre Windows Server). Una solución es trabajar con máquinas virtuales que simulen al máximo el entorno que te vas a encontrar en producción, pero muchas veces es inviable por los recursos y el tiempo necesario para gestionar todas las combinaciones que tenemos en nuestros clientes.
El error: al pasar del entorno de desarrollo a producción, nos encontramos con un error de EF4 al resolver una consulta. Un ejemplo de excepción es:
Exception Details: System.Data.SqlClient.SqlException: Incorrect syntax near ‘(‘.
Al usar IntelliTrace para ver dónde estaba el error, vemos la sentencia SQL que está montando EF para resolver una llamada “FirstOrDefault”:
Al intentar ejecutar esta sentencia en nuestro entorno de desarrollo sobre SQL Server 2008, no da ningún problema. Sin embargo, al ejecutarla sobre SQL Server 2000, da un error de sintaxis en “SELECT TOP(1)”.
Esto ocurre porque el mapping del modelo se ha realizado usando SQL Server 2008 en vez de 2000, con lo que el motor de EF usa T-SQL que no es soportado por la versión en producción.
Para solucionarlo rápidamente, simplemente abrimos el modelo .edmx con el visor XML y editamos el atributo “ProviderManifestToken” cambiando el valor “2008” por “2000”.
Compilamos y listo!!!!
Espero que sirva de ayuda. Un saludo.
Guardado para los trucos.
Gracias!
Tu articulo seria de mayor utilidad si hubieras centrado algo de esfuerzo a corregir ese «SELECT TOP»
Hola Juan, quizás no me expliqué bien en el post o no entiendo a qué te refieres exactamente con corregir el «SELECT TOP».
La instrucción SQL que estás viendo arriba es la que genera Entity Framework 4 al usar LinQ to Entities con una llamada «FirstOrDefault», en código no hay ni una sola sentencia T-SQL.
Para ver las instrucciones SQL que ejecuta EF «por debajo» es necesario usar IntelliTrace y de ahí es la captura. Precisamente en lo que me he centrado es en corregir el problema de «SELECT TOP (» con distintas versiones de SQL Server (realmente no he corregido nada, sino indicarle al EF que trabaje con SQL Server 2000 en vez de SQL Server 2008).
Espero haberlo aclarado mejor. Un saludo.