2009-11-11 11 views
9

He creado una base de datos en MySQL y estoy intentando mapearla con Entity Framework, pero empiezo a ejecutar "GenerateSSDLException" cada vez que intento agregar más que 20 tablas para el contexto EF.Entity Framework with MySQL - Tiempo de espera caducado al generar el modelo

una excepción de tipo ocurrió 'Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine + GenerateSSDLException' al intentar actualizar de la base de datos. El mensaje de excepción es: 'Ocurrió un error al ejecutar la definición del comando. Vea la excepción interna para más detalles. '

Se ha producido un error grave durante la ejecución del comando.

Tiempo de espera caducado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde.

No hay nada especial acerca de las tablas afectadas, y nunca es la misma mesa (s), es sólo que después de haber sido añadido un cierto número (no específica) de las tablas, el contexto ya no pueden ser actualizados sin el " Tiempo de espera caducado "error. A veces solo queda una tabla y otras tres; los resultados son bastante impredecibles Además, la varianza en el número de tablas que se pueden agregar antes del error me indica que tal vez el problema radique en el tamaño de la consulta generada para actualizar el contexto que incluye tanto las definiciones de tablas existentes como las nuevas tablas que se están agregando a esto. Básicamente, la consulta SQL se está haciendo demasiado grande y no se puede ejecutar por algún motivo.

Si genero el modelo con EdmGen2 funciona sin ningún error, pero el archivo EDMX generado no se puede actualizar en Visual Studio sin producir la excepción antes mencionada.

Con toda probabilidad la fuente de este problema radica en la herramienta dentro de Visual Studio dado que EdmGen2 funciona bien, pero espero que tal vez otros puedan ofrecer algunos consejos sobre cómo abordar este problema único, porque parece I'm not the only person experiencing it.

Una sugerencia ofrecida por un colega era mantener dos archivos EBMX separados con un cruce de tabla, pero eso parece una solución bastante desagradable en mi opinión. Supongo que esto es lo que obtengo por tratar de usar "nueva tecnología". :(

+0

No me atrevo a votar ninguna de estas respuestas porque ninguna de ellas enfoca realmente la pregunta real ... La respuesta de Lizard es la única que se parece a una respuesta, pero todavía no está allí ... –

+0

Lo siento, no pude ayuda más, pero eso es lo que haría: p. Me encantaría el voto popular si te sientes generoso! lol – Lizard

+0

Nathan: Ver mi respuesta a continuación. La respuesta aceptada no es correcta para esta pregunta. –

Respuesta

12

Solo tuve dolor de cabeza por este problema durante toda la tarde. Sin embargo, encontré la solución en la que puede agregar una declaración en app.config o web.config donde su conexión EF desinger existe como 'Default Command Timeout = 300000;'. El problema se ha ido.

+0

Esto funcionó perfectamente. Whizz, eres un Dios. –

+1

¿Cuál sería la nueva cadena de conexión? Lo estoy intentando pero obtengo este error en el resultado La palabra clave 'tiempo de espera predeterminado' no es compatible. – effkay

+0

n.m. arreglado ... y representante para Whizz ... salvó mi vida :) – effkay

0

Trate dotConnect for MySQL con Entity Developer.
Hemos hecho algunas mejoras en el proceso de generación de modelos en nuestras herramientas. Puedes añadir el modelo de entidad Devart a su proyecto, que es similar al modelo de ADO.NET Entity Framework, pero tiene algunas mejoras y no tiene el problema de tiempo de espera

0

Dos posibilidades vienen a la mente:.

en primer lugar es que es EF versión 1 (que se incluye con .NET 3.5 SP 1) Ver this y this..

La otra es que esto se parece más o menos a los mismos síntomas que se obtuvieron con SQL Server y controladores pre-ODBC (circa 1991) donde se usó el tipo incorrecto de llamada: un tipo se usa con consultas que devuelven resultados (select) y otras para declaraciones: no se devuelve un resultado (create table). Eventualmente, la conexión se convirtió irremediablemente sin sincronizar tratando de hacer coincidir los resultados SELECT con la consulta correspondiente.(En aquellos días, el Pantalla Azul de la Muerte no existía: la computadora tendieron a reiniciar de forma voluntaria en su lugar.)

Me pregunto si la herramienta está confundiendo el modo de conexión en la variedad de operaciones que se realizan: la creación de tablas , verificando la estructura creada, agregando una nueva columna, completando filas, y verificando o validando el contenido de la fila después de ser llenado. Si esta es la causa, entonces se puede evitar siendo "más puro" sobre la secuencia de operaciones: hacer nada más que completar la tabla crea una después de otra, es decir, no hacer nada que haga que cree una tabla, luego alter table para agregar nueva columnas

+0

No estoy seguro de cómo podría hacer esto con la herramienta EF en Visual Studio. Como expliqué anteriormente, si trato de agregar todas las tablas en una operación, falla el 100% del tiempo. –

1

Ustedes son débiles no explicando cómo solucionar el problema fácilmente:

  1. eliminar todas las conexiones de datos
  2. Descarga la última MySQL Connector (6.3.x)
  3. Abra Visual Studio> Explorador de Sever > Haga clic en "Conexiones de datos"> Agregar conexión
  4. elegir proveedor de base de datos MySQL
  5. Introduzca los detalles de conexión
  6. Haga clic en "Avance"
  7. Encuentra Conectar Intervalo de tiempo y que sea algo así como 30.000
  8. Encuentra un defecto de tiempo de espera de comandos y que sea algo así como 30.000

Guardar todo y luego tratar de actualizar su modelo de EF de nuevo. Probé esto con EF 4.0 y Vs2010, así que sé que funciona.

+0

¡lol! @Omar, si intentas ofrecer una mejor respuesta, ¿podrías sugerir por qué sucede esto? –

+0

@Omar: ¿Sabe que funciona porque ha probado con una versión diferente de EF y VS? – Lucas

5

El consejo anterior no es correcto.

Default Command Timeout es el único parámetro de cadena de conexión que debe cambiar. Connect Time simplemente regula la cantidad de tiempo de espera para obtener una conexión en primer lugar; ese no es tu problema

Default Command Timeout parece que no tiene ningún efecto en la cadena de conexión con el conector/red 6.3.4. Creo que esto es un error en Connector/Net, y archivé un bug report con Oracle. EDITAR: Este error fue reconocido por los desarrolladores de MySQL y se ha corregido desde el 13/10/2010. Las correcciones se pusieron en 6.0.8, 6.1.6, 6.2.5 y 6.3.5.

La única forma de evitar esto fue cambiar la propiedad de mi objeto ObjectContext por otro que no sea nulo.Si es nulo, se supone que debe usar el valor en el "proveedor subyacente" por MSDN. Si no es nulo, es el valor autorizado por el número de segundos antes de un tiempo de espera.

Por ejemplo:

var context = new CitationData.de_rawEntities(); 
context.CommandTimeout = 180; 
+0

Especificar CommandTimeout me ha funcionado en todos los escenarios; Sin embargo, estoy usando una versión anterior de .NET Connector y, por lo tanto, no puedo hablar de la versión más reciente. Configurar el contexto. CommandTimeout no es relevante para el problema anterior porque el problema no ocurre en el código, sino cuando se selecciona "Actualizar el modelo desde la base de datos" en el editor visual/diseñador de Entity Framework. –

+0

Sí, solo recomendé context.CommandTimeout porque el tiempo de espera predeterminado del comando en la cadena de conexión parece estar roto con Connector/Net 6.3.4. Tal vez todavía funciona en la versión en la que estás? Por cierto, CommandTimeout (sin espacio o "Predeterminado") parece ser una propiedad de ObjectContext, mientras que el Tiempo de espera predeterminado del comando parece ser la propiedad de la cadena de conexión. –

+0

El Tiempo de espera de comando predeterminado que no funciona en la cadena de conexión fue realmente un error con el Conector/Red. Esto afectó a todas las versiones desde 6.0. Consulte http://bugs.mysql.com/bug.php?id=56806 para obtener detalles (es posible que deba iniciar sesión para ver el informe de errores). Hasta el 13 de octubre, las versiones 6.0.8, 6.1.6, 6.2.5 y 6.3.5 tenían la solución. –

1

Probé de la solución anterior fue en vano. Descargué el último conector .NET para MySQL (6.3.6) y el problema desapareció.

Cuestiones relacionadas