Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dynamiczne połączenie z bazą danych MySQL dla Entity Framework 6

Entity Framework 6 oferuje kilka przydatnych, subtelnych zmian, które pomagają zarówno w uruchomieniu MySQL, jak i tworzeniu dynamicznych połączeń z bazą danych.

Uruchamianie MySQL działającego z Entity Framework 6

Po pierwsze, w momencie mojej odpowiedzi na to pytanie, jedynymi sterownikami złącza .Net zgodnymi z EF6 jest MySQL .Net Connectior 6.8.1 (wersja rozwojowa Beta), który można znaleźć na oficjalnej stronie MySQL tutaj .

Po zainstalowaniu odwołaj się do następujących plików z rozwiązania Visual Studio:

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

Będziesz także musiał skopiować te pliki w miejsce, gdzie będą one dostępne dla projektu w czasie kompilacji, na przykład w katalogu bin.

Następnie musisz dodać kilka elementów do pliku Web.config (lub App.config, jeśli korzystasz z komputera stacjonarnego).

Ciąg połączenia:

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

Dodaj również dostawcę, wewnątrz <entityFramework /> oraz <providers /> węzłów, opcjonalnie (jest to absolutna konieczność w drugiej części mojej odpowiedzi, gdy mamy do czynienia z dynamicznie definiowanymi bazami danych) możesz zmienić <defaultConnectionFactory /> węzeł:

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

Jeśli zmienisz defaultConnectionFactory z domyślnego połączenia z serwerem sql, nie zapomnij usunąć <parameter> węzły, które są zagnieżdżone w węźle defaultConnectionFactory. MysqlConnectionFactory nie przyjmuje żadnych parametrów dla swojego konstruktora i nie powiedzie się, jeśli parametry nadal tam są.

Na tym etapie połączenie z MySQL za pomocą Entity jest dość łatwe, możesz po prostu odnieść się do powyższego ciągu połączeń po nazwie. Zwróć uwagę, że jeśli łączysz się według nazwy, zadziała to nawet wtedy, gdy defaultConnectionFactory węzeł nadal wskazuje na SQL Server (co robi domyślnie).

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

To tylko kwestia normalnego podłączenia:

ApplicationDbContext db = ApplicationDbContext();

Łączenie z dynamicznie wybraną nazwą bazy danych

W tym momencie łatwo jest połączyć się z bazą danych, którą możemy przekazać jako parametr, ale jest kilka rzeczy, które musimy zrobić.

Ważna uwaga

Jeśli jeszcze tego nie zrobiłeś, MUSISZ zmienić defaultConnectionFactory w Web.config, jeśli chcesz połączyć się z MySQL dynamicznie. Ponieważ będziemy przekazywać ciąg połączenia bezpośrednio do konstruktora kontekstu, nie będzie on wiedział, którego dostawcy użyć i przejdzie do domyślnej fabryki połączeń, chyba że zostanie określony w pliku inweb.config. Zobacz powyżej, jak to zrobić.

Możesz ręcznie przekazać ciąg połączenia do kontekstu w następujący sposób:

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

Ale żeby to trochę ułatwić, możemy wprowadzić niewielką zmianę w ciągu połączenia, który zrobiliśmy powyżej podczas konfigurowania mySQL. Wystarczy dodać symbol zastępczy, jak pokazano poniżej:

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

Teraz możemy zbudować metodę pomocniczą i zmienić klasę ApplicationDbContext, jak pokazano poniżej:

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

Jeśli używasz migracji baz danych, ważny jest następujący krok

Jeśli używasz migracji, zauważysz, że ApplicationDbContext zostanie przekazany do metody Seed przez framework i nie powiedzie się, ponieważ nie będzie przekazywał parametru, który umieściliśmy dla nazwy bazy danych.

Dodaj następującą klasę na dole swojej klasy kontekstu (lub w dowolnym miejscu), aby rozwiązać ten problem.

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

Twoje migracje typu code-first i metody inicjujące będą teraz kierowane na developmentdb schemat w Twojej bazie danych MySQL.

Mam nadzieję, że to komuś pomoże :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Korzystanie z Doradców ds. tworzenia kopii zapasowych baz danych w celu automatyzacji zadań konserwacyjnych

  2. Jak zbudować tablicę JSON z bazy danych mysql

  3. Procedura składowana MySQL Alter

  4. Przekształć wynik bazy danych w tablicę

  5. Składnia SQL SELECT – wymieniona przez DBMS