mysql asp.net-mvc entity-framework-4 code-first ctp

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



asp.net-mvc entity-framework-4 (3)

Pensé que iba a experimentar un poco con el último post de Scott Guthrie en el desarrollador de código primero con Entity Framework 4. En lugar de usar el servidor SQL, intento usar MySQL. Aquí están las partes relevantes de mi web.config (esta es una aplicación Asp.Net MVC 2):

<connectionStrings> <add name="NerdDinners" connectionString="Server=localhost; Database=NerdDinners; Uid=root; Pwd=;" providerName="MySql.Data.MySqlClient"/> </connectionStrings> <system.data> <DbProviderFactories> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.2.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </DbProviderFactories> </system.data>

Al igual que el tutorial, espero que EF4 genere la db para mí automáticamente. En su lugar, lanza una excepción ProviderIncompatibleException, con una excepción interna quejándose de que la base de datos NerdDinners no existe.

Lo suficientemente justo; Fui y creé la base de datos de MySql para ver si las cosas iban a funcionar, y obtuve otra excepción ProviderIncompatibleException. Esta vez, "DatabaseExists no es compatible con el proveedor".

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


Bien, finalmente lo conseguí trabajando con algunos puntos de interés.

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

En definitiva, un camino largo pero al final

** Actualización Otro punto a tener en cuenta: cuando implemente su sitio MVC utilizando MySQL, lo que más le interese es que también agregue un DataFactory a su web.config. Por lo general, debido a la diferencia entre los conectores MySQL y las versiones de MySQL que son compatibles. (Respuesta encontrada a través de otras fuentes después de mucho rascarse la cabeza) Solo agregue:

<system.data> <DbProviderFactories> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </DbProviderFactories> </system.data>

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 localmente" su DLL MySQL para asegurar la compatibilidad.


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

Como se señaló, el nombre de la cadena de conexión tiene que coincidir con el nombre de la Clase que extiende el System.Data.Entity.DbContext.

Parece que no hay forma de crear tablas en EF usando el conector mySQL, pero puede usar y modificar los scripts de creación SQL para generar las tablas mySQL. La forma 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 las tablas. Si encuentro que estoy haciendo esto con más frecuencia, planeo resolver esto mediante el uso de la inyección de dependencias y tengo clases separadas basadas en una configuración de mySQL o MSSQL.

Me resultó más fácil asegurarme de que las cajas de desarrollo y los servidores tuvieran el conector de MySQL correcto .dll empaquetado en la versión que el desorden con los DbFactoryProviders en el webconfig. Hacer que el empaquetado fuera correcto en el paquete de compilación del proyecto / solución significaba que solo necesitaba las líneas de conexión y no las líneas DbFactoryProviders, que me resultaron difíciles de trabajar de manera coherente en una serie de 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 crea mySQL.


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