2010-07-19 30 views
29

Pensé en experimentar un poco con latest post de Scott Guthrie en el desarrollo de código primero con Entity Framework 4. En vez de usar Sql Server, estoy tratando de usar MySql. Aquí son las partes pertinentes de mi web.config (esto es una aplicación Asp.Net MVC 2):Usando MySql con Entity Framework 4 y Code-First Development CTP

EF4
<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, estoy esperando para generar el DB yo 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 bueno; 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".

Admitiré que esta es la primera vez que profundizo en Entity Framework (me he limitado a Linq to Sql), y todo esto se ejecuta 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?

+0

Tiene razón, existe un proveedor de MySQL (http://stackoverflow.com/questions/76488/using-mysql-with-entity-framework/848539#848539). Es posible que los bits CTP tengan errores o que el proveedor de MySQL carezca de funcionalidad (o ambos). – marcind

+0

¿puede usar membresía simple en MVC 4 con MySQL? –

Respuesta

25

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

  • No se puede crear una base de datos, debe existir ya
  • Tienes que crear una cadena de conexión para cada concurso de DB usando el nombre DBContext (en el ejemplo anterior debe existir un connectionstring con el nombre "NerdDinners"), no se solo uno por defecto (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.

Con todo, un camino largo, pero allí en el final

** Actualización Otro punto a destacar, al desplegar su sitio MVC usando MySQL lo más como también la necesidad de añadir un DataFactory a su página .config. Generalmente debido a la diferencia en los conectores MySql que existen y las versiones de MySQL compatibles. (respuesta encontró a través de otras fuentes después de tanto rascarse la cabeza) Sólo tiene que añadir:

<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 asegurándose de establecer el número de versión de la MySql.Data.dll implementar con el sitio (también es una buena idea "copiar como local" sus archivos DLL MySQL para garantizar la compatibilidad.

+0

Marcó el suyo como la respuesta, ya que encontró una manera :). ¡Impresionante trabajo! – Dusda

+0

¿Tuvo que crear las tablas usted mismo o genera las tablas para usted? – DennyFerra

+0

Entity framework todavía no puede crear tablas desafortunadamente, por lo que tendrá que hacerlo usted mismo (también la nota en algunos hosts nombres de tablas y columnas son sensibles a las mayúsculas y minúsculas). – Darkside

2

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) a continuación, puede conectarse a su instancia MySql a través de Visual Studio ...

2

Esta pregunta y la respuesta ha sido muy útil para mí migrar un proyecto de EF más grande de SQL a MySQL, así que pensé que iba a añadir mis notas y espero que son útiles:

Como se ha indicado el nombre de la cadena de conexión tiene para que coincida con el nombre de la clase que extiende el System.Data.Entity.DbContext.

Parece que todavía no hay forma de crear tablas en EF usando el conector mySQL, pero puede usar y modificar los scripts creados SQL 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 inyección de dependencia y tener clases separadas basadas en una configuración mySQL o MSSQL.

Me pareció más fácil asegurarme de que las cajas de desarrollo y los servidores tenían el conector mySQL correcto .dll empaquetado en la versión que interferir con los proveedores de DbFactory en el 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 parámetro 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 mixtos de mis objetos en comparación con las tablas de casos fijos que crea mySQL.

Cuestiones relacionadas