Entity Framework 6 menawarkan beberapa perubahan halus yang berguna yang membantu membuat MySQL bekerja dan juga membuat koneksi database dinamis.
Membuat MySQL bekerja dengan Entity Framework 6
Pertama, pada saat saya menjawab pertanyaan ini, satu-satunya driver konektor .Net yang kompatibel dengan EF6 adalah MySQL .Net Connectior 6.8.1 (versi pengembangan Beta) yang dapat ditemukan di situs resmi MySQL di sini .
Setelah menginstal, referensi file berikut dari solusi Visual Studio Anda:
- Mysql.Data.dll
- Mysql.Data.Entity.EF6.dll
Anda juga perlu menyalin file-file ini di suatu tempat yang dapat diakses oleh proyek selama waktu pembuatan, seperti direktori bin.
Selanjutnya, Anda perlu menambahkan beberapa item ke file Web.config (atau App.config jika berbasis desktop).
String koneksi:
<connectionStrings>
<add name="mysqlCon"
connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password"
providerName="MySql.Data.MySqlClient" />
</connectionStrings>
Tambahkan juga penyedia, di dalam <entityFramework />
dan <providers />
node, secara opsional (ini adalah keharusan mutlak di bagian kedua dari jawaban saya, ketika berhadapan dengan database yang didefinisikan secara dinamis) Anda dapat mengubah <defaultConnectionFactory />
simpul:
<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>
Jika Anda mengubah defaultConnectionFactory dari koneksi default sql server, jangan lupa untuk menghapus <parameter>
node yang bersarang di node defaultConnectionFactory. MysqlConnectionFactory tidak mengambil parameter apa pun untuk konstruktornya dan akan gagal jika parameternya masih ada.
Pada tahap ini, cukup mudah untuk terhubung ke MySQL dengan Entity, Anda bisa merujuk ke connectionString di atas dengan nama. Perhatikan bahwa jika menghubungkan dengan nama, ini akan berfungsi bahkan jika defaultConnectionFactory
node masih menunjuk ke SQL Server (yang dilakukan secara default).
public class ApplicationDbContext: DbContext
{
public ApplicationDbContext() : base("mysqlCon")
{
}
}
Ini hanya masalah menghubungkan secara normal:
ApplicationDbContext db = ApplicationDbContext();
Menghubungkan ke nama database yang dipilih secara dinamis
Pada titik ini, mudah untuk terhubung ke database yang dapat kita lewati sebagai parameter, tetapi ada beberapa hal yang perlu kita lakukan.
Catatan Penting
Jika Anda belum melakukannya, Anda HARUS mengubah defaultConnectionFactory di Web.config jika Anda ingin terhubung ke MySQL secara dinamis. Karena kita akan meneruskan string koneksi langsung ke konstruktor konteks, itu tidak akan tahu penyedia mana yang akan digunakan dan akan beralih ke pabrik koneksi default kecuali ditentukan di web.config. Lihat di atas tentang cara melakukannya.
Anda dapat meneruskan string koneksi secara manual ke konteks seperti ini:
public ApplicationDbContext() : base("Server:localhost;...")
{
}
Tetapi untuk membuatnya sedikit lebih mudah, kita dapat membuat sedikit perubahan pada string koneksi yang kita buat di atas saat mengatur mySQL. Cukup tambahkan placeholder seperti yang ditunjukkan di bawah ini:
<add name="mysqlCon" connectionString="Server=localhost;Database={0};Uid=username;Pwd=password" providerName="MySql.Data.MySqlClient" />
Sekarang kita dapat membangun metode pembantu dan mengubah kelas ApplicationDbContext seperti yang ditunjukkan di bawah ini:
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);
}
}
Jika Anda menggunakan migrasi database, langkah berikut ini penting
Jika Anda menggunakan migrasi, Anda akan menemukan bahwa ApplicationDbContext akan diteruskan ke metode Seed Anda oleh kerangka kerja dan itu akan gagal karena tidak akan meneruskan parameter yang kami masukkan untuk nama database.
Tambahkan kelas berikut ke bagian bawah kelas konteks Anda (atau di mana pun sebenarnya) untuk menyelesaikan masalah itu.
public class MigrationsContextFactory : IDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext Create()
{
return new ApplicationDbContext("developmentdb");
}
}
Migrasi code-first dan metode seed Anda sekarang akan menargetkan developmentdb
skema di database MySQL Anda.
Semoga ini bisa membantu seseorang :)