sql >> Database >  >> RDS >> Mysql

Dynamische MySQL-databaseverbinding voor Entity Framework 6

Entity Framework 6 biedt een aantal handige subtiele veranderingen die zowel helpen om MySQL te laten werken als om dynamische databaseverbindingen te creëren.

MySQL laten werken met Entity Framework 6

Ten eerste, op de datum waarop ik deze vraag beantwoordde, zijn de enige .Net-connectorstuurprogramma's die compatibel zijn met EF6 de MySQL .Net Connectior 6.8.1 (bèta-ontwikkelingsversie) die kan worden gevonden op de officiële MySQL-website hier .

Verwijs na de installatie naar de volgende bestanden van uw Visual Studio-oplossing:

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

U moet deze bestanden ook ergens naartoe kopiëren waar ze tijdens de bouw toegankelijk zijn voor het project, zoals de bin-map.

Vervolgens moet u enkele items toevoegen aan uw Web.config (of App.config indien op desktop gebaseerd) bestand.

Een verbindingsreeks:

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

Voeg ook de provider toe, binnen het <entityFramework /> en <providers /> nodes, optioneel (dit is een absolute must in het tweede deel van mijn antwoord, als je te maken hebt met dynamisch gedefinieerde databases) kun je de <defaultConnectionFactory /> wijzigen knoop:

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

Als u de defaultConnectionFactory wijzigt van de standaard sql-serververbinding, vergeet dan niet de <parameter> te verwijderen knooppunten die zijn genest in het knooppunt defaultConnectionFactory. De MysqlConnectionFactory gebruikt geen parameters voor zijn constructor en zal mislukken als de parameters er nog zijn.

In dit stadium is het vrij eenvoudig om verbinding te maken met MySQL met Entity, je kunt gewoon naar de hierboven vermelde connectionString bij naam verwijzen. Merk op dat als u verbinding maakt op naam, dit zelfs werkt als de defaultConnectionFactory node wijst nog steeds naar SQL Server (wat het standaard doet).

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

Het is gewoon een kwestie van normaal verbinden:

ApplicationDbContext db = ApplicationDbContext();

Verbinding maken met een dynamisch geselecteerde databasenaam

Op dit moment is het gemakkelijk om verbinding te maken met een database die we als parameter kunnen doorgeven, maar er zijn een paar dingen die we moeten doen.

Belangrijke opmerking

Als u dat nog niet hebt gedaan, MOET u de standaardConnectionFactory in Web.config wijzigen als u dynamisch verbinding wilt maken met MySQL. Aangezien we een verbindingsreeks rechtstreeks aan de contextconstructor doorgeven, weet deze niet welke provider hij moet gebruiken en keert hij terug naar zijn standaardverbindingsfabriek, tenzij gespecificeerd inweb.config. Zie hierboven hoe je dat doet.

U kunt als volgt handmatig een verbindingsreeks aan de context doorgeven:

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

Maar om het een beetje gemakkelijker te maken, kunnen we een kleine wijziging aanbrengen in de verbindingsreeks die we hierboven hebben gemaakt bij het instellen van mySQL. Voeg gewoon een tijdelijke aanduiding toe zoals hieronder weergegeven:

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

Nu kunnen we een helpermethode bouwen en de ApplicationDbContext-klasse wijzigen zoals hieronder getoond:

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

Als u databasemigraties gebruikt, is de volgende stap belangrijk

Als u migraties gebruikt, zult u merken dat de ApplicationDbContext door het framework aan uw Seed-methode wordt doorgegeven en dat deze mislukt omdat deze niet wordt doorgegeven in de parameter die we hebben ingevoerd voor de databasenaam.

Voeg de volgende klasse toe aan de onderkant van je contextklasse (of waar dan ook) om dat probleem op te lossen.

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

Uw code-first migraties en seed-methoden zijn nu gericht op de developmentdb schema in uw MySQL-database.

Ik hoop dat dit iemand helpt :)



  1. Hoe de gemiddelde verkoop per dag te berekenen in MySQL

  2. Zoek afhankelijkheden in SQL Server:sql_expression_dependencies

  3. TreeView-knooppunten opnieuw rangschikken met slepen en neerzetten

  4. Wat is @@TEXTSIZE in SQL Server?