Uso de MySql con Entity Framework 4 y Code-First Development CTP

Pensé que podría experimentar un poco con la última publicación de Scott Guthrie sobre desarrollo de código primero con Entity Framework 4. En vez de usar Sql Server, estoy tratando de usar MySql. Aquí están las partes relevantes de mi web.config (esta es una aplicación Asp.Net MVC 2):

        

Al igual que en el tutorial, espero que EF4 genere el archivo db automáticamente. En su lugar, arroja una ProviderIncompatibleException, con una excepción interna que se queja de que la base de datos NerdDinners no existe.

Lo suficientemente justo; Fui y creé MySql db solo para ver si las cosas funcionaban, y obtuve otra ProviderIncompatibleException en su lugar. Esta vez, “DatabaseExists no es compatible con el proveedor”.

Admito que esta es la primera vez que estoy profundizando en Entity Framework (me he limitado a Linq to Sql), y todo esto se está ejecutando en el CTP Code-First lanzado solo la semana pasada. Dicho esto, ¿hay algo que estoy haciendo mal aquí, o un problema conocido que se puede solucionar?

Correcto, finalmente lo consiguió trabajando con algunos puntos de interés.

  • No se puede crear una base de datos, debe existir ya
  • Debe crear una cadena de conexión para cada concurso de DB utilizando el nombre DBContext (en el ejemplo anterior debe existir una conexión con el nombre “NerdDinners”), no solo una predeterminada (de lo contrario usará SQL)
  • Utilizará el nombre del nombre DBSet que use para definir su contexto como el nombre de la tabla, así que tenga cuidado al nombrarlos.

En general, un largo camino pero al final

** Actualización Otro punto a tener en cuenta, al desplegar su sitio MVC usando MySQL, lo que más le gustará es agregar un DataFactory a su web.config. Por lo general, debido a la diferencia en los conectores MySql que existen y las versiones de MySQL compatibles. (respuesta encontrada a través de otras fonts después de mucho rascarse la cabeza) Solo agregue:

       

Como una sección separada de su web.config, asegúrese de establecer el número de versión de MySQL.Data.dll que implementa con el sitio (también es una buena idea “copiar como local” sus archivos DLL de MySQL para garantizar la compatibilidad.

Otro punto de interés: si agrega la entrada “Proveedor de datos MySQL” a su machine.config local (C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config en mi caso), puede conectarse a su instancia MySql a través de Visual Studio …

Esta pregunta y respuesta me ha sido muy útil para migrar un proyecto de EF más grande de SQL a mySQL, así que pensé en agregar mis notas y esperar que fueran útiles:

Como se indicó, el nombre de la cadena de conexión debe coincidir con el nombre de la clase que extiende System.Data.Entity.DbContext.

Parece que todavía no hay forma de crear tablas en EF utilizando el conector mySQL, pero puede usar y modificar las secuencias de comandos SQL create para generar las tablas mySQL. La manera más fácil que encontré para hacer esto fue comentar dentro y fuera de la función OnModelCreating en el DbContext extendido dependiendo de si el código era necesario para recrear tablas. Si descubro que estoy haciendo esto más a menudo, planeo resolver esto usando la dependency injection y tener clases separadas basadas en una configuración mySQL o MSSQL.

Me resultó más fácil asegurarme de que las cajas de desarrollo y los servidores tenían el .dll del conector mySQL correcto empaquetado en la versión de la aplicación y no los problemas con los proveedores de DbFactory en el archivo webconfig. Conseguir el embalaje correcto en el paquete de construcción del proyecto / solución significaba que solo necesitaba las líneas de cadena de conexión y no las líneas de DbFactoryProviders, que me resultó difícil trabajar de forma consistente en varias máquinas.

Necesitaba cambiar la sensibilidad de mayúsculas / minúsculas del identificador mySQL de la configuración que tenía de 0 a 1. Sin esta configuración, el SQL que EF conectó no pudo encontrar las tablas que estaban allí debido a los nombres de casos mixtos de mis objetos en comparación con las tablas de casos fijos que mySQL crea