Mempersiapkan untuk mengakses MySQL dengan Entity Framework Core (database-first)
Lingkungan konfirmasi operasi
- Visual Studio
-
- Studio Visual 2022
- .JARING
-
- .NET 8
- Inti Kerangka Kerja Entitas
-
- Kerangka Kerja Entitas Inti 8.0
- MySQL
-
- MySQL 8.4
- Pomelo.EntityFrameworkCore.MySql
-
- 8.0.2
*Di atas adalah lingkungan verifikasi, tetapi mungkin berfungsi di versi lain.
Pada awalnya
Entity Framework Core adalah pustaka pemetaan O/R yang memungkinkan Anda mengakses catatan database melalui model (kelas) yang ditentukan kode tanpa langsung menulis pernyataan SQL saat mengakses database. Ini memberikan manfaat sebagai berikut:
- Tidak menulis pernyataan SQL secara langsung, mengurangi risiko keamanan seperti injeksi SQL
- Karena pernyataan SQL adalah string, bahkan jika mereka membuat kesalahan dalam sintaks, mereka tidak tunduk pada pemeriksaan kesalahan build, tetapi karena model adalah sintaks program, model dapat diperiksa untuk kesalahan pada waktu build.
Entity Framework Core secara otomatis menghasilkan kode untuk terhubung ke model dan database ini dari database yang ada, Sebaliknya, ada cara untuk menulis kode secara manual dan kemudian secara otomatis menghasilkan database.
Yang pertama disebut "database-first" dan yang terakhir disebut "code-first". Ada juga "model-first" yang menghasilkan kode dan database dari cetak biru, seperti diagram ER, tetapi tidak banyak digunakan di Entity Framework Core.
Kali ini, kita akan menggunakan pola "database-first" yang menghasilkan kode dengan asumsi bahwa database sudah ada.
Pengaturan MySQL
Dalam tip ini, pastikan Anda menyiapkan MySQL terlebih dahulu untuk mengakses database MySQL Anda. Ini dapat diatur di PC di lingkungan pengembangan Anda atau di PC lain melalui jaringan. Jika Anda dapat terhubung ke MySQL dari lingkungan pengembangan Anda, Anda siap melakukannya. Dalam tip ini, kami telah menginstal MySQL di lingkungan yang berbeda.
Langkah-langkah penyiapan MySQL akan dihilangkan karena akan berlebihan. Halaman berikut berisi tips terkait MySQL untuk langkah-langkah penyiapan.
Membuat tabel
Dalam hal ini, kita akan membuat skema (database) dan tabel berikut sebagai sampel.
- Nama Skema : test_schema
- Nama Tabel : pengguna
- Kolom Tabel : [id], [nama], [kata sandi], [usia], [email], [ulang tahun], [is_provisional_registration], [update_datetime]
Tidak masalah bagaimana Anda menulisnya, tetapi jika membosankan, jalankan dan hasilkan SQL berikut terhadap MySQL:
Berikut ini adalah SQL pembuatan skema:
CREATE DATABASE `test_schema`;
Pembuatan tabel adalah SQL.
CREATE TABLE `user` (
`id` int NOT NULL,
`name` varchar(20) NOT NULL,
`password` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL,
`email` varchar(200) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`is_provisional_registration` tinyint(1) NOT NULL,
`update_datetime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='テストコメント';
Tambahkan rekaman ke SQL.
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (1, '氏名1', 'aaaa', 20, 'aaaa@example.com', '2020-04-01', 0, '2021-03-14T00:00:00.0000000');
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (2, '氏名2', 'bbbb', 30, 'bbbb@example.com', '2010-04-01', 1, '2021-03-14T00:00:00.0000000');
Menetapkan izin untuk akun Anda
Pastikan Anda memiliki nama host yang disiapkan sehingga akun yang Anda program dapat mengakses skema MySQL.
Anda juga perlu mengatur izin untuk test_schema
mengakses akun yang ingin Anda sambungkan.
Kali ini, kami akan melakukan SELECT
proses pengambilan catatan.
Saya tidak akan melakukannya kali ini, tetapi jika Anda INSERT
UPDATE
ingin menyisipkan atau memperbarui, silakan periksa dan .
Penyiapan Visual Studio
Dengan asumsi Anda sudah mengaturnya juga. Jika Anda ingin mengetahui prosedur penyiapan, kami telah merangkumnya di halaman berikut.
Membuat proyek
Entity Framework Core tidak bergantung pada lingkungan eksekusi tertentu, sehingga dapat digunakan dalam banyak proyek. Dalam hal ini, kita akan menggunakan Entity Framework Core di lingkungan aplikasi konsol sederhana.
Dalam proyek baru, pilih Aplikasi Konsol (mana saja yang bukan .NET Framework).
Anda telah membuat proyek. Nama proyek bisa apa saja.
Dapatkan paket Entity Framework Core untuk MySQL
Dapatkan paket untuk menggunakan Entity Framework Core dengan NuGet. Paket menggunakan: Ini tidak resmi dari Microsoft, tetapi banyak digunakan.
- Pomelo.EntityFrameworkCore.MySql
Klik kanan pada dependensi dan pilih Kelola Paket NuGet.
Dengan "Telusuri" dipilih dari tab, ketik di bidang Pomelo
pencarian . Daftar paket terkait akan ditampilkan.
Instal paket berikut dari ini:
- Pomelo.EntityFrameworkCore.MySql
Pilih apa yang ingin Anda instal dan klik tombol Instal. Pilih versi stabil terbaru untuk versi tersebut.
Dialognya pada dasarnya OK dan baik-baik saja.
Saya pikir paketnya adalah sebagai berikut.
Kemudian ketik EntityFrameworkCore
di bidang pencarian dan instal yang berikut ini juga.
- Microsoft.EntityFrameworkCore.Tools
Untuk versi, cocokkan Pomelo.EntityFrameworkCore.MySql
versi yang direferensikan Microsoft.EntityFrameworkCore
oleh .
Kali ini kita mengacu pada 8.0.2, jadi Microsoft.EntityFrameworkCore.Tools
mari kita buat 8.0.2 juga.
Paket ini digunakan untuk menghasilkan kode dari database.
Pada akhirnya, itu akan terlihat seperti ini:
Membuat model (kode) dari konfigurasi tabel database
Agar model dan kode lainnya dibuat secara otomatis, Anda harus terlebih dahulu membangun proyek untuk memastikan tidak ada kesalahan. Jika ada kesalahan, model akan gagal. Jika Anda telah memverifikasi bahwa tidak ada kesalahan, Anda tidak perlu membangun.
Buka Konsol Pengelola Paket dari Visual Studio. Jika tidak, Anda dapat membukanya dari menu Alat, NuGet Package Manager, dan Package Manager Console.
Anda akan melihat jendela seperti yang di bawah ini, jadi pastikan bahwa "Proyek default" di sudut kanan atas adalah proyek yang ingin Anda buat modelnya. (Anda harus berhati-hati jika Anda memiliki banyak proyek)
Masukkan teks berikut di bidang input: Parameter akan berubah tergantung pada lingkungan, jadi harap ubah tepat waktu berdasarkan penjelasan berikut.
Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Contoh Masukan
Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Contoh Parameter | Penjelasan Parameter | |
---|---|---|
Penyedia | Jika itu MySQL Pomelo.EntityFrameworkCore.MySql , tentukan seperti. |
Pomelo.EntityFrameworkCore.MySql |
Sambungan | Ini adalah string koneksi untuk terhubung ke database. String koneksi dapat digunakan di aplikasi lain, jadi silakan tulis konten yang ditentukan sesuai dengan notasi string koneksi. Omong-omong, ini hanya digunakan sementara untuk membuat model, jadi tidak perlu menyadari keamanan setelah menerbitkan aplikasi untuk string koneksi ini. Jika Anda memiliki simbol di kata sandi Anda, berhati-hatilah tentang melarikan diri. | "Server = Server Uji; Basis data=test_schema; pengguna = pengguna uji; kata sandi=XXXXXXXX;" |
f | Paksa penimpaan bahkan jika Anda sudah memiliki program. | Tidak ada <> |
Pengarah Keluaran | Jalur folder untuk mengeluarkan kode. Jalur relatif dari folder proyek | Model\Basis Data |
Konteks | Nama kelas konteks saat menggunakan Kerangka Kerja Entitas | TestDatabaseDbContext |
UseDatabaseNames | Jika ditentukan, nama tabel dalam database akan menjadi nama kelas apa adanya. Jika tidak, kasus nama kelas entitas disesuaikan sesuai dengan aturan. | Tidak ada <> |
Anotasi Data | Jika ditentukan, jenis kolom secara otomatis menambahkan atribut DataAnnotation ke setiap properti. Ini sedikit berguna jika Anda ingin melakukan pengecekan input secara otomatis sesuai dengan jenis database. | Tidak ada <> |
Ruang nama | Namespace tempat kelas entitas yang dihasilkan berada. Jika tidak ditentukan, namespace ditentukan sesuai dengan folder. | TestNamespace |
ContextNamespace | Namespace tempat Context yang dihasilkan berada. Jika tidak ditentukan, namespace ditentukan sesuai dengan folder. | TestNamespace |
NoOnConfiguring | Hindari menyematkan string koneksi mentah dalam kode Anda. | Tidak ada <> |
TidakMenjamak | Hindari nama properti jamak dari setiap nama tabel dalam Konteks. | Tidak ada <> |
Tekan Enter untuk menjalankannya dan membuat kode secara otomatis: Jika itu adalah kesalahan, alasannya akan ditampilkan, jadi harap tanggapi sesuai dengan isi kesalahan.
user
Kode model untuk tabel terlihat seperti ini:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SetupMysqlDatabaseFirst.Models.Database;
<summary>
テストコメント
</summary>
public partial class user
{
[Key]
public int id { get; set; }
[StringLength(20)]
public string name { get; set; } = null!;
[StringLength(20)]
public string? password { get; set; }
public int? age { get; set; }
[StringLength(200)]
public string? email { get; set; }
public DateOnly? birthday { get; set; }
public bool is_provisional_registration { get; set; }
[Column(TypeName = "datetime")]
public DateTime? update_datetime { get; set; }
}
Omong-omong, peringatan ditampilkan karena string koneksi ditulis seperti dalam kode kelas konteks yang dihasilkan. Jika memungkinkan, string koneksi harus disimpan di tempat terpisah dan diatur saat runtime, tetapi kali ini untuk tujuan memeriksa operasi, jadi saya akan membiarkannya apa adanya.
Dapatkan rekaman dan lihat
Sekarang setelah Anda memiliki kode untuk mengakses catatan dalam database, mari kita coba mendapatkan catatan dan menampilkannya di konsol.
Program.cs
dan memodifikasinya sebagai berikut.
using SetupMysqlDatabaseFirst.Models.Database;
using System.Text.Json;
Console.WriteLine("Hello, World!");
// データベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContext();
// データベースから User 一覧を取得する
var users = dbContext.user.ToList();
// 取得した User 情報をコンソールに書き出す
foreach (var user in users)
{
Console.WriteLine(JsonSerializer.Serialize(user));
}
Hasilkan DbContext
kelas new
yang dibuat secara otomatis dengan . Ini dideklarasikan untuk memungkinkan using var
koneksi database dihancurkan secara otomatis.
dbContext
telah menghasilkan properti untuk mengakses setiap model, jadi kali user
ini Anda dapat memanipulasi rekaman dalam tabel dengan User
mengakses properti.
Anda tidak perlu mengetahui SQL yang dikeluarkan karena dibuat secara otomatis secara internal.
ToList
Di sini kita menggunakan user
metode ekstensi untuk mendapatkan semua catatan dalam tabel.
foreach
Setelah itu, saya menggunakan user
metode dan JsonSerializer.Serialize
untuk menampilkan informasi di konsol.
Seperti user
disebutkan di atas, setiap kolom dalam tabel dideklarasikan sebagai properti, sehingga juga dimungkinkan untuk mengambil nilai satu per satu.