Bersedia untuk mengakses MySQL dengan Entity Framework Core (pangkalan data pertama)

Tarikh penciptaan halaman :

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.