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