sql >> Databáze >  >> RDS >> Mysql

Dynamické připojení k databázi MySQL pro Entity Framework 6

Entity Framework 6 nabízí několik praktických drobných změn, které pomáhají jak při zprovoznění MySQL, tak při vytváření dynamických databázových připojení.

Jak MySQL pracovat s Entity Framework 6

Za prvé, k datu mé odpovědi na tuto otázku byl jediným ovladačem konektoru .Net kompatibilním s EF6 MySQL .Net Connectior 6.8.1 (vývojová verze beta), který lze nalézt na oficiálních stránkách MySQL zde .

Po instalaci použijte následující soubory z vašeho řešení sady Visual Studio:

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

Tyto soubory budete také muset zkopírovat někam, kde budou během sestavení přístupné projektu, jako je například adresář bin.

Dále je třeba přidat některé položky do souboru Web.config (nebo App.config, pokud používáte počítač).

Připojovací řetězec:

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

Přidejte také poskytovatele do <entityFramework /> a <providers /> uzly, volitelně (toto je absolutní nutnost v druhé části mé odpovědi, když se zabýváte dynamicky definovanými databázemi), můžete změnit <defaultConnectionFactory /> uzel:

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

Pokud změníte defaultConnectionFactory z výchozího připojení k serveru SQL, nezapomeňte odstranit <parameter> uzly, které jsou vnořeny do uzlu defaultConnectionFactory. MysqlConnectionFactory nepřebírá žádné parametry pro svůj konstruktor a selže, pokud parametry stále existují.

V této fázi je docela snadné se připojit k MySQL pomocí Entity, stačí se odkázat na connectionString výše podle názvu. Všimněte si, že pokud se připojujete podle názvu, bude to fungovat, i když defaultConnectionFactory uzel stále ukazuje na SQL Server (což ve výchozím nastavení dělá).

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

Jde jen o to se normálně připojit:

ApplicationDbContext db = ApplicationDbContext();

Připojování k dynamicky vybranému názvu databáze

V tomto okamžiku je snadné se připojit k databázi, kterou můžeme předat jako parametr, ale musíme udělat několik věcí.

Důležitá poznámka

Pokud jste tak ještě neučinili, MUSÍTE změnit defaultConnectionFactory v Web.config, pokud se chcete připojit k MySQL dynamicky. Protože budeme připojovací řetězec předávat přímo konstruktoru kontextu, nebude vědět, kterého poskytovatele použít, a přejde na svou výchozí továrnu připojení, pokud není uvedeno v souboru inweb.config. Viz výše, jak to udělat.

Připojovací řetězec můžete do kontextu předat ručně takto:

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

Ale abychom to trochu usnadnili, můžeme provést malou změnu v připojovacím řetězci, který jsme provedli výše při nastavování mySQL. Stačí přidat zástupný symbol, jak je znázorněno níže:

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

Nyní můžeme sestavit pomocnou metodu a změnit třídu ApplicationDbContext, jak je ukázáno níže:

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

Pokud používáte migraci databáze, je důležitý následující krok

Pokud používáte migraci, zjistíte, že ApplicationDbContext bude předán vaší metodě Seed rámcem a ta selže, protože nebude předat parametr, který jsme zadali pro název databáze.

Chcete-li tento problém vyřešit, přidejte následující třídu na konec vaší kontextové třídy (nebo opravdu kamkoli).

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

Vaše migrace kódu a počáteční metody se nyní zaměří na developmentdb schéma ve vaší databázi MySQL.

Doufám, že to někomu pomůže :)



  1. Zip pomocí Oracle Stored Procedure

  2. Migrace schématu:Vztah ke hvězdě

  3. Připojte se k serveru MySQL přes SSH v PHP

  4. instalace Oracle Instantclient na Mac OS/X bez nastavení proměnných prostředí?