MySQL constituye una base de datos muy versátil para cierto tipo de aplicaciones, gratuita y con un gran número de opciones se ha convertido en un standard para aplicaciones de tamaño medio aunque también sea válida para aplicaciones de gran tamaño.
A pesar de que generalmente se asocia con aplicaciones de código libre y con otros lenguajes de programación actualmente también tiene desarrollado un conector para .NET que soporta Entity Framework 6.
En este caso vamos a ver su configuración para Code First en .NET 4.5.1, el proyecto de ejemplo será una aplicación MVC usando Visual Studio 2013 aunque cualquier tipo de proyecto es válido.
Lo primero es instalar el conector, se puede descargar directamente o usando NuGet, en este caso usaremos NuGet por ser el sistema más habitual actualmente.
Hay que instalar dos paquetes:
- Entity Framework 6.1.3
- MySql.Data.Entity 6.9.8 (que instalará MySql.Data 6.9.8)
Una vez hecho esto agregamos en web.config la configuración de EF, algunas de estas secciones nos las incluirá el propio paquete NuGet, todas se incluyen dentro del raíz de configuración (nodo “configuration”)
Primero la sección de configuración,
<configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections>
La sección propiamente dicha,
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v12.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
</provider>
</providers>
</entityFramework>
El proveedor de datos,
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<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.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
Y la cadena de conexión,
<connectionStrings> <add name="MyContext" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=DB;uid=user;password=password" /> </connectionStrings>
Después tenemos que indicar la clase DbConfiguration que usaremos, para esto hay varias opciones:
- Se puede incluir en la sección de configuración de web.config a través de:
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
o en una clase que inicialice la aplicación a través de la sentencia:
DbConfiguration.SetConfiguration(new MySqlEFConfiguration());
Otra opción es como un atributo en la clase del contexto, este es el método que usaremos ya que dependiendo del tipo de proyecto (MVC en este caso) puede no ser posible por la forma en la que se inicializa la aplicación (si estamos usamos por ejemplo un atributo de inicialización) ya que nos dará un error indicando que la configuración por defecto ya ha sido cargada.
namespace XXX.Models
{
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyContext : DbContext
{
public PorraContext() : base("MyContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
}
Una vez hecho habilitamos las migraciones con el comando:
Enable-Migrations
En la clase Configuration que nos habrá creado incluiremos las siguientes dos líneas la primera nos generará el código MySQL correcto (sino al crear una migración nos dará error) y la segunda línea servirá para que nos generé la tabla _MigrationHistory correctamente (sino nos dará un error de longitud de clave).
internal sealed class Configuration : DbMigrationsConfiguration<XXX.Models.PorraContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); //here s the thing.
}
protected override void Seed(Porra.Models.MyContext context) { }
}
Después de hacer esto ya podremos incluir y lanzar migraciones sin problemas, con los comandos.
Add-Migration XXX_1.0
Update-Database – Verbose