Bersedia untuk mengakses MySQL dengan Entity Framework Core (pangkalan data pertama)
Persekitaran pengesahan operasi
- Visual Studio
-
- Studio Visual 2022
- .BERSIH
-
- .NET 8
- Teras Rangka Kerja Entiti
-
- Rangka Kerja Entiti Teras 8.0
- Mysql
-
- MySQL 8.4
- Pomelo.EntityFrameworkCore.MySql
-
- 8.0.2
*Perkara di atas ialah persekitaran pengesahan, tetapi ia mungkin berfungsi dalam versi lain.
Pada mulanya
Entiti Framework Core ialah perpustakaan pemetaan O/R yang membolehkan anda mengakses rekod pangkalan data melalui model (kelas) yang ditakrifkan kod tanpa menulis pernyataan SQL secara langsung apabila mengakses pangkalan data. Ini memberikan faedah berikut:
- Tidak menulis pernyataan SQL secara langsung, mengurangkan risiko keselamatan seperti suntikan SQL
- Memandangkan pernyataan SQL ialah rentetan, walaupun ia membuat kesilapan dalam sintaks, ia tidak tertakluk kepada menyemak ralat binaan, tetapi memandangkan model ialah sintaks program, ia boleh disemak untuk ralat pada masa binaan.
Entiti Framework Core secara automatik menjana kod untuk menyambung ke model dan pangkalan data ini daripada pangkalan data sedia ada, Sebaliknya, terdapat cara untuk menulis kod secara manual dan kemudian menjana pangkalan data secara automatik.
Yang pertama dipanggil "pangkalan data pertama" dan yang kedua dipanggil "kod pertama". Terdapat juga "model-pertama" yang menjana kod dan pangkalan data daripada pelan tindakan, seperti gambar rajah ER, tetapi ia tidak digunakan secara meluas dalam Teras Rangka Kerja Entiti.
Kali ini, kami akan menggunakan corak "pangkalan data pertama" yang menjana kod dengan andaian bahawa pangkalan data sudah wujud.
Persediaan MySQL
Dalam petua ini, pastikan anda menyediakan MySQL terlebih dahulu untuk mengakses pangkalan data MySQL anda. Ia boleh disediakan pada PC dalam persekitaran pembangunan anda atau pada PC lain melalui rangkaian. Jika anda boleh menyambung ke MySQL daripada persekitaran pembangunan anda, anda boleh pergi. Dalam petua ini, kami telah memasang MySQL dalam persekitaran yang berbeza.
Langkah persediaan MySQL akan ditinggalkan kerana ia akan berlebihan. Halaman berikut mengandungi petua berkaitan MySQL untuk langkah persediaan.
Mencipta jadual
Dalam kes ini, kami akan mencipta skema berikut (pangkalan data) dan jadual sebagai sampel.
- Nama Skema : test_schema
- Nama Jadual : pengguna
- Lajur Jadual : [id], [nama], [kata laluan], [umur], [e-mel], [hari lahir], [is_provisional_registration], [update_datetime]
Tidak kira bagaimana anda menulisnya, tetapi jika ia membosankan, jalankan dan jana SQL berikut terhadap MySQL:
Berikut ialah SQL penciptaan skema:
CREATE DATABASE `test_schema`;
Penciptaan jadual ialah 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='テストコメント';
Tambah rekod 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');
Tetapkan kebenaran untuk akaun anda
Pastikan anda mempunyai nama hos yang disediakan supaya akaun yang anda programkan boleh mengakses skema MySQL.
Anda juga perlu menetapkan kebenaran untuk test_schema
mengakses akaun yang ingin anda sambungkan.
Kali ini, kami akan melakukan SELECT
proses mendapatkan semula rekod.
Saya tidak akan melakukannya kali ini, tetapi jika anda INSERT
UPDATE
ingin memasukkan atau mengemas kini, sila semak dan .
Persediaan Visual Studio
Dengan mengandaikan anda telah menyediakannya juga. Jika anda ingin mengetahui prosedur persediaan, kami telah meringkaskannya pada halaman berikut.
Buat projek
Entiti Framework Core tidak bergantung pada persekitaran pelaksanaan tertentu, jadi ia boleh digunakan dalam banyak projek. Dalam kes ini, kami akan menggunakan Entiti Framework Core dalam persekitaran aplikasi konsol yang mudah.
Dalam projek baharu, pilih Apl Konsol (yang mana bukan .NET Framework).
Anda telah mencipta projek itu. Nama projek boleh menjadi apa sahaja.
Dapatkan pakej Teras Rangka Kerja Entiti untuk MySQL
Dapatkan pakej untuk menggunakan Entiti Framework Core dengan NuGet. Pakej ini menggunakan: Ini bukan rasmi daripada Microsoft, tetapi ia digunakan secara meluas.
- Pomelo.EntityFrameworkCore.MySql
Klik kanan pada kebergantungan dan pilih Urus Pakej NuGet.
Dengan "Semak imbas" dipilih daripada tab, taip dalam medan Pomelo
carian . Senarai pakej berkaitan akan dipaparkan.
Pasang pakej berikut daripada ini:
- Pomelo.EntityFrameworkCore.MySql
Pilih perkara yang anda mahu pasang dan klik butang Pasang. Pilih versi stabil terkini untuk versi tersebut.
Dialog pada asasnya OK dan baik-baik saja.
Saya fikir pakejnya adalah seperti berikut.
Kemudian taip EntityFrameworkCore
dalam medan carian dan pasang yang berikut juga.
- Microsoft.EntityFrameworkCore.Tools
Untuk versi, Pomelo.EntityFrameworkCore.MySql
padankan versi yang dirujuk Microsoft.EntityFrameworkCore
oleh .
Kali ini kita merujuk kepada 8.0.2, jadi Microsoft.EntityFrameworkCore.Tools
mari kita jadikan 8.0.2 juga.
Pakej ini digunakan untuk menjana kod daripada pangkalan data.
Pada akhirnya, ia sepatutnya kelihatan seperti ini:
Cipta model (kod) daripada konfigurasi jadual pangkalan data
Untuk menjadikan model anda dan kod lain dijana secara automatik, anda mesti membina projek anda terlebih dahulu untuk memastikan tiada ralat. Sekiranya terdapat ralat, model akan gagal. Jika anda telah mengesahkan bahawa tiada ralat, anda tidak perlu membina.
Buka Konsol Pengurus Pakej daripada Visual Studio. Jika tidak, anda boleh membukanya daripada menu Alat, Pengurus Pakej NuGet dan Konsol Pengurus Pakej.
Anda akan melihat tetingkap seperti di bawah, jadi pastikan bahawa "Projek lalai" di penjuru kanan sebelah atas ialah projek yang anda mahu buat modelnya. (Anda perlu berhati-hati jika anda mempunyai berbilang projek)
Masukkan teks berikut dalam medan input: Parameter akan berubah bergantung pada persekitaran, jadi sila tukarnya tepat pada masanya berdasarkan penjelasan berikut.
Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Contoh Input
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 | |
---|---|---|
Pembekal | Jika ia adalah Pomelo.EntityFrameworkCore.MySql MySQL, nyatakan seperti. |
Pomelo.EntityFrameworkCore.MySql |
Sambungan | Ini ialah rentetan sambungan untuk menyambung ke pangkalan data. Rentetan sambungan boleh digunakan dalam apl lain, jadi sila tulis kandungan yang ditentukan mengikut notasi rentetan sambungan. Dengan cara ini, ia hanya digunakan buat sementara waktu untuk membuat model, jadi tidak perlu menyedari keselamatan selepas menerbitkan apl untuk rentetan sambungan ini. Jika anda mempunyai simbol dalam kata laluan anda, berhati-hati tentang melarikan diri. | "Pelayan = Pelayan Ujian; Pangkalan Data = test_schema; pengguna = pengguna ujian; kata laluan=XXXXXXXX;" |
f | Tulis ganti paksa walaupun anda sudah mempunyai program. | Tiada <> |
Pengarah Output | Laluan folder untuk mengeluarkan kod. Laluan relatif daripada folder projek | Model\Pangkalan Data |
Konteks | Nama kelas konteks apabila menggunakan Rangka Kerja Entiti | TestDatabaseDbContext |
UseDatabaseNames | Jika ditentukan, nama jadual dalam pangkalan data akan menjadi nama kelas sebagaimana adanya. Jika tidak, kes nama kelas entiti diselaraskan mengikut peraturan. | Tiada <> |
Anotasi Data | Jika ditentukan, jenis lajur secara automatik menambah atribut DataAnnotation pada setiap sifat. Ini agak berguna jika anda ingin melakukan pemeriksaan input secara automatik mengikut jenis pangkalan data. | Tiada <> |
Ruang nama | Ruang nama yang dimiliki oleh kelas entiti yang dijana. Jika tidak dinyatakan, ruang nama ditentukan mengikut folder. | Ruang Nama Ujian |
Ruang Nama Konteks | Ruang nama yang dimiliki oleh Konteks yang dijana. Jika tidak dinyatakan, ruang nama ditentukan mengikut folder. | Ruang Nama Ujian |
NoOnConfiguring | Elakkan membenamkan rentetan sambungan mentah dalam kod anda. | Tiada <> |
TidakPluralize | Elakkan nama sifat jamak bagi setiap nama jadual dalam Konteks. | Tiada <> |
Tekan Enter untuk menjalankannya dan menjana kod secara automatik: Jika ia adalah ralat, sebabnya akan dipaparkan, jadi sila balas mengikut kandungan ralat.
user
Kod model untuk jadual kelihatan 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; }
}
Dengan cara ini, amaran dipaparkan kerana rentetan sambungan ditulis seperti dalam kod kelas konteks yang dijana. Jika boleh, rentetan sambungan hendaklah disimpan di tempat yang berasingan dan ditetapkan pada masa jalan, tetapi kali ini ia adalah untuk tujuan memeriksa operasi, jadi saya akan membiarkannya seadanya.
Dapatkan rekod dan lihatnya
Memandangkan anda mempunyai kod untuk mengakses rekod dalam pangkalan data, mari kita cuba mendapatkan rekod dan memaparkannya dalam konsol.
Program.cs
dan ubah suainya seperti 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));
}
Jana DbContext
kelas new
yang dijana secara automatik dengan . Ia diisytiharkan untuk membolehkan using var
sambungan pangkalan data dimusnahkan secara automatik.
dbContext
telah menjana sifat untuk mengakses setiap model, jadi kali user
ini anda boleh memanipulasi rekod dalam jadual dengan User
mengakses sifat.
Anda tidak perlu menyedari SQL yang dikeluarkan kerana ia dijana secara dalaman secara automatik.
ToList
Di sini kita menggunakan user
kaedah sambungan untuk mendapatkan semua rekod dalam jadual.
foreach
Selepas itu, saya menggunakan user
kaedah dan JsonSerializer.Serialize
untuk memaparkan maklumat dalam konsol.
Seperti user
yang dinyatakan di atas, setiap lajur dalam jadual diisytiharkan sebagai sifat, jadi ia juga mungkin untuk mendapatkan semula nilai secara individu.