Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Dynamische MySQL-Datenbankverbindung für Entity Framework 6

Entity Framework 6 bietet einige praktische subtile Änderungen, die sowohl dabei helfen, MySQL zum Laufen zu bringen als auch dynamische Datenbankverbindungen zu erstellen.

MySQL mit Entity Framework 6 zum Laufen bringen

Erstens ist zum Zeitpunkt meiner Beantwortung dieser Frage der einzige .Net-Connector-Treiber, der mit EF6 kompatibel ist, MySQL .Net Connectior 6.8.1 (Beta-Entwicklungsversion), der unter auf der offiziellen MySQL-Website hier .

Verweisen Sie nach der Installation auf die folgenden Dateien aus Ihrer Visual Studio-Lösung:

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

Sie müssen diese Dateien auch an einen Ort kopieren, an dem sie während der Erstellungszeit für das Projekt zugänglich sind, z. B. in das bin-Verzeichnis.

Als Nächstes müssen Sie einige Elemente zu Ihrer Datei Web.config (oder App.config, falls auf Desktops basierend) hinzufügen.

Eine Verbindungszeichenfolge:

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

Fügen Sie außerdem den Anbieter innerhalb von <entityFramework /> hinzu und <providers /> Knoten, optional (dies ist ein absolutes Muss im zweiten Teil meiner Antwort, wenn es um dynamisch definierte Datenbanken geht) können Sie den <defaultConnectionFactory /> ändern Knoten:

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

Wenn Sie die defaultConnectionFactory von der Standard-SQL-Serververbindung ändern, vergessen Sie nicht, <parameter> zu entfernen Knoten, die im defaultConnectionFactory-Knoten verschachtelt sind. Die MysqlConnectionFactory übernimmt keine Parameter für ihren Konstruktor und schlägt fehl, wenn die Parameter noch vorhanden sind.

In diesem Stadium ist es ziemlich einfach, mit Entity eine Verbindung zu MySQL herzustellen, Sie können einfach auf den ConnectionString oben mit dem Namen verweisen. Beachten Sie, dass die Verbindung nach Name auch dann funktioniert, wenn die defaultConnectionFactory node zeigt immer noch auf SQL Server (was standardmäßig der Fall ist).

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

Es ist nur eine Frage der normalen Verbindung:

ApplicationDbContext db = ApplicationDbContext();

Verbinden mit einem dynamisch ausgewählten Datenbanknamen

An diesem Punkt ist es einfach, eine Verbindung zu einer Datenbank herzustellen, die wir als Parameter übergeben können, aber es gibt ein paar Dinge, die wir tun müssen.

Wichtiger Hinweis

Wenn Sie dies noch nicht getan haben, MÜSSEN Sie die defaultConnectionFactory in Web.config ändern, wenn Sie sich dynamisch mit MySQL verbinden möchten. Da wir eine Verbindungszeichenfolge direkt an den Kontextkonstruktor übergeben, weiß dieser nicht, welcher Anbieter verwendet werden soll, und wendet sich an seine Standardverbindungsfactory, sofern dies nicht in web.config angegeben ist. Siehe oben, wie das geht.

Sie könnten eine Verbindungszeichenfolge wie folgt manuell an den Kontext übergeben:

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

Aber um es ein wenig einfacher zu machen, können wir eine kleine Änderung an der Verbindungszeichenfolge vornehmen, die wir oben beim Einrichten von mySQL vorgenommen haben. Fügen Sie einfach einen Platzhalter wie unten gezeigt hinzu:

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

Jetzt können wir eine Hilfsmethode erstellen und die ApplicationDbContext-Klasse wie unten gezeigt ändern:

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

Wenn Sie Datenbankmigrationen verwenden, ist der folgende Schritt wichtig

Wenn Sie Migrationen verwenden, werden Sie feststellen, dass der ApplicationDbContext vom Framework an Ihre Seed-Methode übergeben wird und fehlschlägt, da der Parameter, den wir für den Datenbanknamen eingegeben haben, nicht übergeben wird.

Fügen Sie die folgende Klasse am Ende Ihrer Kontextklasse (oder irgendwo wirklich) hinzu, um dieses Problem zu lösen.

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

Ihre Code-First-Migrationen und Seed-Methoden zielen jetzt auf developmentdb ab Schema in Ihrer MySQL-Datenbank.

Hoffe das hilft jemandem :)