sql >> Databasteknik >  >> RDS >> Mysql

Dynamisk MySQL-databasanslutning för Entity Framework 6

Entity Framework 6 erbjuder några praktiska subtila ändringar som hjälper till att både få MySQL att fungera och även skapa dynamiska databasanslutningar.

Få MySQL att fungera med Entity Framework 6

För det första, när jag svarade på den här frågan, är de enda .Net-anslutningsdrivrutinerna som är kompatibla med EF6 MySQL .Net Connectior 6.8.1 (betautvecklingsversion) som kan hittas på den officiella MySQL-webbplatsen här .

Efter installationen, referera till följande filer från din Visual Studio-lösning:

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

Du måste också kopiera dessa filer någonstans där de kommer att vara tillgängliga för projektet under byggtiden, till exempel bin-katalogen.

Därefter måste du lägga till några objekt till din Web.config-fil (eller App.config om den är baserad på skrivbordet).

En anslutningssträng:

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

Lägg även till leverantören i <entityFramework /> och <providers /> noder, valfritt (detta är ett absolut måste i den andra delen av mitt svar, när du har att göra med dynamiskt definierade databaser) kan du ändra <defaultConnectionFactory /> nod:

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

Om du ändrar standardConnectionFactory från standard sql-serveranslutningen, glöm inte att ta bort <parameter> noder som är kapslade i standardConnectionFactory-noden. MysqlConnectionFactory tar inga parametrar för sin konstruktor och kommer att misslyckas om parametrarna fortfarande finns där.

I det här skedet är det ganska enkelt att ansluta till MySQL med Entity, du kan bara referera till connectionString ovan med namn. Observera att om du ansluter med namn kommer detta att fungera även om defaultConnectionFactory noden pekar fortfarande på SQL Server (vilket den gör som standard).

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

Det är bara en fråga om att ansluta normalt:

ApplicationDbContext db = ApplicationDbContext();

Ansluter till ett dynamiskt valt databasnamn

Vid det här laget är det lätt att ansluta till en databas som vi kan skicka som en parameter, men det finns några saker vi behöver göra.

Viktig anmärkning

Om du inte redan har gjort det, MÅSTE du ändra standardConnectionFactory i Web.config om du vill ansluta till MySQL dynamiskt. Eftersom vi kommer att skicka en anslutningssträng direkt till kontextkonstruktorn, kommer den inte att veta vilken leverantör som ska användas och kommer att vända sig till sin standardanslutningsfabrik om inte specificerats inweb.config. Se ovan om hur du gör det.

Du kan skicka en anslutningssträng manuellt till sammanhanget så här:

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

Men för att göra det lite enklare kan vi göra en liten ändring i anslutningssträngen vi gjorde ovan när vi satte upp mySQL. Lägg bara till en platshållare som visas nedan:

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

Nu kan vi bygga en hjälpmetod och ändra klassen ApplicationDbContext som visas nedan:

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

Om du använder databasmigreringar är följande steg viktigt

Om du använder migrering kommer du att upptäcka att ApplicationDbContext kommer att skickas till din Seed-metod av ramverket och det kommer att misslyckas eftersom det inte kommer att skicka in parametern som vi lägger in för databasnamnet.

Lägg till följande klass längst ner i din sammanhangsklass (eller var som helst egentligen) för att lösa det problemet.

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

Dina kodförsta-migreringar och seed-metoder kommer nu att rikta in sig på developmentdb schemat i din MySQL-databas.

Hoppas detta hjälper någon :)



  1. Hur LPAD() fungerar i MariaDB

  2. Pandas:Hur man läser och skriver filer

  3. Kartlägg ett PostGIS-geometripunktfält med Hibernate on Spring Boot

  4. SQL Server - transaktioner återgår vid fel?