Mysql
 sql >> Base de données >  >> RDS >> Mysql

Connexion dynamique à la base de données MySQL pour Entity Framework 6

Entity Framework 6 propose quelques modifications subtiles pratiques qui aident à la fois à faire fonctionner MySQL et à créer des connexions de base de données dynamiques.

Faire fonctionner MySQL avec Entity Framework 6

Tout d'abord, à la date de ma réponse à cette question, le seul pilote de connecteur .Net compatible avec EF6 est le MySQL .Net Connectior 6.8.1 (version de développement Beta) qui se trouve sur le site officiel de MySQL ici .

Après l'installation, référencez les fichiers suivants à partir de votre solution Visual Studio :

  • Mysql.Data.dll
  • Mysql.Data.Entity.EF6.dll

Vous devrez également copier ces fichiers à un endroit où ils seront accessibles au projet pendant la construction, comme le répertoire bin.

Ensuite, vous devez ajouter quelques éléments à votre fichier Web.config (ou App.config si sur ordinateur).

Une chaîne de connexion :

<connectionStrings>
    <add name="mysqlCon"
         connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password" 
         providerName="MySql.Data.MySqlClient" />
</connectionStrings>

Ajoutez également le fournisseur, à l'intérieur du <entityFramework /> et <providers /> nœuds, éventuellement (c'est un must absolu dans la deuxième partie de ma réponse, lorsqu'il s'agit de bases de données définies dynamiquement), vous pouvez modifier le <defaultConnectionFactory /> noeud :

<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>

Si vous modifiez defaultConnectionFactory à partir de la connexion au serveur sql par défaut, n'oubliez pas de supprimer le <parameter> nœuds imbriqués dans le nœud defaultConnectionFactory. La MysqlConnectionFactory ne prend aucun paramètre pour son constructeur et échouera si les paramètres sont toujours là.

À ce stade, il est assez facile de se connecter à MySQL avec Entity, vous pouvez simplement vous référer à la chaîne de connexion ci-dessus par son nom. Notez que si vous vous connectez par nom, cela fonctionnera même si le defaultConnectionFactory le nœud pointe toujours vers SQL Server (ce qu'il fait par défaut).

public class ApplicationDbContext: DbContext
{
    public ApplicationDbContext() : base("mysqlCon")
    {
    }
}

Ensuite il suffit de se connecter normalement :

ApplicationDbContext db = ApplicationDbContext();

Connexion à un nom de base de données sélectionné dynamiquement

À ce stade, il est facile de se connecter à une base de données que nous pouvons passer en paramètre, mais il y a quelques choses que nous devons faire.

Remarque importante

Si vous ne l'avez pas déjà fait, vous DEVEZ modifier defaultConnectionFactory dans Web.config si vous souhaitez vous connecter dynamiquement à MySQL. Puisque nous transmettrons une chaîne de connexion directement au constructeur de contexte, il ne saura pas quel fournisseur utiliser et se tournera vers sa fabrique de connexion par défaut, sauf indication contraire dans web.config. Voir ci-dessus comment procéder.

Vous pouvez passer manuellement une chaîne de connexion au contexte comme ceci :

public ApplicationDbContext() : base("Server:localhost;...")
{
}

Mais pour le rendre un peu plus facile, nous pouvons apporter une petite modification à la chaîne de connexion que nous avons faite ci-dessus lors de la configuration de mySQL. Ajoutez simplement un espace réservé comme indiqué ci-dessous :

<add name="mysqlCon" connectionString="Server=localhost;Database={0};Uid=username;Pwd=password" providerName="MySql.Data.MySqlClient" />

Nous pouvons maintenant créer une méthode d'assistance et modifier la classe ApplicationDbContext comme indiqué ci-dessous :

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);
    }
}

Si vous utilisez des migrations de base de données, l'étape suivante est importante

Si vous utilisez des migrations, vous constaterez que ApplicationDbContext sera transmis à votre méthode Seed par le framework et il échouera car il ne transmettra pas le paramètre que nous avons mis pour le nom de la base de données.

Ajoutez la classe suivante au bas de votre classe de contexte (ou n'importe où vraiment) pour résoudre ce problème.

public class MigrationsContextFactory : IDbContextFactory<ApplicationDbContext>
{
    public ApplicationDbContext Create()
    {
        return new ApplicationDbContext("developmentdb");
    }
}

Vos migrations code-first et vos méthodes d'amorçage cibleront désormais developmentdb schéma dans votre base de données MySQL.

J'espère que cela aide quelqu'un :)