Entity Framework 6 offre alcune utili modifiche sottili che aiutano sia a far funzionare MySQL sia a creare connessioni dinamiche al database.
Come far funzionare MySQL con Entity Framework 6
Innanzitutto, alla data in cui ho risposto a questa domanda, l'unico driver del connettore .Net compatibile con EF6 è MySQL .Net Connectior 6.8.1 (versione di sviluppo Beta) che può essere trovato sul sito Web ufficiale di MySQL qui .
Dopo l'installazione, fare riferimento ai seguenti file dalla soluzione di Visual Studio:
- Mysql.Data.dll
- Mysql.Data.Entity.EF6.dll
Dovrai anche copiare questi file in un punto in cui saranno accessibili al progetto durante la fase di compilazione, come la directory bin.
Successivamente, è necessario aggiungere alcuni elementi al file Web.config (o App.config se basato su desktop).
Una stringa di connessione:
<connectionStrings>
<add name="mysqlCon"
connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password"
providerName="MySql.Data.MySqlClient" />
</connectionStrings>
Aggiungi anche il provider, all'interno di <entityFramework />
e <providers />
nodi, facoltativamente (questo è un must assoluto nella seconda parte della mia risposta, quando si tratta di database definiti dinamicamente) è possibile modificare il <defaultConnectionFactory />
nodo:
<entityFramework>
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
</providers>
</entityFramework>
Se modifichi defaultConnectionFactory dalla connessione predefinita al server sql, non dimenticare di rimuovere il <parameter>
nodi che sono nidificati nel nodo defaultConnectionFactory. MysqlConnectionFactory non accetta alcun parametro per il suo costruttore e fallirà se i parametri sono ancora presenti.
A questo punto, è abbastanza facile connettersi a MySQL con Entity, puoi semplicemente fare riferimento alla connectionString sopra per nome. Nota che se ti connetti per nome, funzionerà anche se il defaultConnectionFactory
il nodo punta ancora a SQL Server (cosa che fa per impostazione predefinita).
public class ApplicationDbContext: DbContext
{
public ApplicationDbContext() : base("mysqlCon")
{
}
}
Si tratta solo di connettersi normalmente:
ApplicationDbContext db = ApplicationDbContext();
Connessione a un nome di database selezionato dinamicamente
A questo punto è facile connettersi a un database che possiamo passare come parametro, ma ci sono alcune cose che dobbiamo fare.
Nota importante
Se non l'hai già fatto, DEVI modificare defaultConnectionFactory in Web.config se desideri connetterti a MySQL in modo dinamico. Poiché passeremo una stringa di connessione direttamente al costruttore del contesto, non saprà quale provider utilizzare e passerà alla sua factory di connessione predefinita a meno che non sia specificato inweb.config. Vedi sopra come farlo.
Puoi passare manualmente una stringa di connessione al contesto in questo modo:
public ApplicationDbContext() : base("Server:localhost;...")
{
}
Ma per renderlo un po' più semplice, possiamo apportare una piccola modifica alla stringa di connessione che abbiamo fatto in precedenza durante l'impostazione di MySQL. Basta aggiungere un segnaposto come mostrato di seguito:
<add name="mysqlCon" connectionString="Server=localhost;Database={0};Uid=username;Pwd=password" providerName="MySql.Data.MySqlClient" />
Ora possiamo creare un metodo di supporto e modificare la classe ApplicationDbContext come mostrato di seguito:
public class ApplicationDbContext: DbContext
{
public ApplicationDbContext(string dbName) : base(GetConnectionString(dbName))
{
}
public static string GetConnectionString(string dbName)
{
// Server=localhost;Database={0};Uid=username;Pwd=password
var connString =
ConfigurationManager.ConnectionStrings["mysqlCon"].ConnectionString.ToString();
return String.Format(connString, dbName);
}
}
Se stai utilizzando migrazioni di database, il passaggio seguente è importante
Se stai usando le migrazioni, scoprirai che ApplicationDbContext verrà passato al tuo metodo Seed dal framework e fallirà perché non passerà il parametro che abbiamo inserito per il nome del database.
Aggiungi la seguente classe in fondo alla tua classe di contesto (o ovunque davvero) per risolvere quel problema.
public class MigrationsContextFactory : IDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext Create()
{
return new ApplicationDbContext("developmentdb");
}
}
Le tue migrazioni code-first e i metodi seed ora avranno come target developmentdb
schema nel tuo database MySQL.
Spero che questo aiuti qualcuno :)