Priprava na dostop do MySQL z Entity Framework Core (najprej zbirka podatkov)

Datum ustvarjanja strani :

Okolje za potrditev delovanja

Visual Studio
  • Visual Studio 2022
.MREŽA
  • .NET 8
Jedro ogrodja entitet
  • Jedro ogrodja entitet 8.0
MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Zgoraj navedeno je okolje za preverjanje, vendar lahko deluje tudi v drugih različicah.

Sprva

Entity Framework Core je knjižnica preslikavnikov O / R, ki omogočajo dostop do zapisov zbirke podatkov prek kodno določenih modelov (razredov) brez neposrednega pisanja izjav SQL pri dostopu do baze podatkov. To zagotavlja naslednje prednosti:

  • Ne piše izjav SQL neposredno, kar zmanjšuje varnostna tveganja, kot je vbrizgavanje SQL
  • Ker so izjave SQL nizi, tudi če naredijo napako v sintaksi, niso predmet preverjanja napak pri gradnji, ker pa je model sintaksa programa, ga je mogoče preveriti za napake v času gradnje.

Entity Framework Core samodejno ustvari kodo za povezavo s temi modeli in bazami podatkov iz obstoječih baz podatkov, Nasprotno pa obstaja način za ročno pisanje kode in nato samodejno ustvarjanje baze podatkov.

Prvi se imenuje »najprej baza podatkov«, drugi pa »najprej koda«. Obstaja tudi "model-first", ki ustvarja kodo in baze podatkov iz načrtov, kot so diagrami ER, vendar se v Entity Framework Core ne uporablja pogosto.

Tokrat bomo uporabili vzorec »baze podatkov«, ki ustvari kodo ob predpostavki, da baza podatkov že obstaja.

Nastavitev MySQL

V tem nasvetu se prepričajte, da ste vnaprej nastavili MySQL za dostop do baze podatkov MySQL. Nastavite ga lahko v računalniku v razvojnem okolju ali v drugem računalniku prek omrežja. Če se lahko povežete z MySQL iz svojega razvojnega okolja, ste pripravljeni. V tem nasvetu smo namestili MySQL v drugačnem okolju.

Koraki namestitve MySQL bodo izpuščeni, saj bodo odveč. Na naslednjih straneh so nasveti za nastavitev, povezani z MySQL.

Ustvarjanje tabele

V tem primeru bomo kot vzorec ustvarili naslednjo shemo (bazo podatkov) in tabelo.

  • Ime sheme : test_schema
  • Ime tabele : uporabnik
  • Stolpci tabele: [id], [ime], [geslo], [starost], [e-pošta], [rojstni dan], [is_provisional_registration], [update_datetime]

Ni pomembno, kako ga napišete, če pa je dolgočasno, zaženite in ustvarite naslednji SQL proti MySQL:

Sledi SQL za ustvarjanje sheme:

CREATE DATABASE `test_schema`;

Ustvarjanje tabele je 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='テストコメント';

Dodajte zapis v 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');

Nastavitev dovoljenj za račun

Prepričajte se, da imate nastavljeno ime gostitelja, tako da lahko račun, ki ga programirate, dostopa do sheme MySQL.

Prav tako morate nastaviti dovoljenja za dostop do test_schema računa, s katerim želite vzpostaviti povezavo.

Tokrat bomo izvedli SELECT postopek pridobivanja zapisov. Tokrat tega ne bom storil, če pa želite INSERT UPDATE vstaviti ali posodobiti, preverite in .

Nastavitev programa Visual Studio

Ob predpostavki, da ste ga že nastavili. Če želite vedeti postopek namestitve, smo ga povzeli na naslednji strani.

Ustvarjanje projekta

Jedro okvira entitet ni odvisno od določenega izvedbenega okolja, zato ga je mogoče uporabiti v številnih projektih. V tem primeru bomo uporabili Entity Framework Core v preprostem aplikacijskem okolju konzole.

V novem projektu izberite Konzolna aplikacija (kar ni .NET Framework).

Ustvarili ste projekt. Ime projekta je lahko karkoli.

Pridobite osnovni paket Entity Framework za MySQL

Pridobite paket za uporabo jedra Entity Framework z NuGetom. Paket uporablja: To ni uradno od Microsofta, vendar se pogosto uporablja.

  • Pomelo.EntityFrameworkCore.MySql

Z desno tipko miške kliknite odvisnost in izberite Upravljanje paketov NuGet.

Ko na zavihku izberete »Prebrskaj«, vnesite v iskalno polje Pomelo . Prikaže se seznam sorodnih paketov.

Iz tega namestite naslednje pakete:

  • Pomelo.EntityFrameworkCore.MySql

Izberite, kaj želite namestiti, in kliknite gumb Namesti. Izberite najnovejšo stabilno različico za različico.

Dialog je v bistvu v redu in v redu.

Mislim, da je sveženj naslednji.

Nato vnesite EntityFrameworkCore v iskalno polje in namestite tudi naslednje.

  • Microsoft.EntityFrameworkCore.Tools

Za različice se ujemajte z različico, Pomelo.EntityFrameworkCore.MySql na katero Microsoft.EntityFrameworkCore se sklicuje . Tokrat se sklicujemo na 8.0.2, zato Microsoft.EntityFrameworkCore.Tools naj bo tudi 8.0.2. Ta paket se uporablja za ustvarjanje kode iz baze podatkov.

Na koncu bi moralo izgledati takole:

Ustvarjanje modela (kode) iz konfiguracije tabele zbirke podatkov

Če želite, da se vaš model in druga koda samodejno ustvarijo, morate najprej sestaviti projekt, da se prepričate, da ni napak. Če pride do napake, model ne bo uspel. Če ste že preverili, da ni napak, vam ni treba graditi.

Odprite konzolo upravitelja paketov v programu Visual Studio. Če ne, ga lahko odprete v meniju Orodja, Upravitelj paketov NuGet in Konzola upravitelja paketov.

Videli boste okno, kot je spodnje, zato se prepričajte, da je »Privzeti projekt« v zgornjem desnem kotu projekt, za katerega želite ustvariti model. (Bodite previdni, če imate več projektov)

V vnosno polje vnesite naslednje besedilo: Parametri se bodo spreminjali glede na okolje, zato jih pravočasno spremenite na podlagi naslednjih pojasnil.

Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Primer vnosa

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Razlaga parametra Primer parametra
Ponudnik Če je Pomelo.EntityFrameworkCore.MySql MySQL, navedite, kot je. Pomelo.EntityFrameworkCore.MySql
Povezava To je niz povezave za povezavo z zbirko podatkov. Povezovalni niz se lahko uporablja v drugih aplikacijah, zato napišite določeno vsebino v skladu z zapisom povezovalnega niza. Mimogrede, uporablja se le začasno za ustvarjanje modela, zato se po objavi aplikacije za ta povezovalni niz ni treba zavedati varnosti. Če imate v geslu simbol, bodite previdni pri pobegu. "Strežnik=TestServer; Baza podatkov=test_schema; uporabnik=test-uporabnik; geslo=XXXXXXXX;"
f Vsilite prepis, tudi če že imate program. Ni <>
Izhodni dir Pot do mape za izpis kode. Relativna pot iz mape projekta Modeli\Baza podatkov
Kontekstu Imena razredov konteksta pri uporabi ogrodja entitet TestDatabaseDbContext
UseDatabaseNames Če je določeno, bo ime tabele v zbirki podatkov ime razreda, kot je. V nasprotnem primeru se primer imena razreda entitet prilagodi v skladu s pravili. Ni <>
Opombe podatkov Če je določeno, vrsta stolpca samodejno doda atribut DataAnnotation vsaki lastnosti. To je nekoliko uporabno, če želite samodejno preveriti vnos glede na vrsto baze podatkov. Ni <>
Namespace Imenski prostor, v katerega spada ustvarjeni razred entitete. Če ni navedeno, je imenski prostor določen glede na mapo. TestImenski prostor
Kontekstni imenski prostor Imenski prostor, ki mu pripada ustvarjeni kontekst. Če ni navedeno, je imenski prostor določen glede na mapo. TestImenski prostor
NoOnConfiguring Izogibajte se vdelavanju neobdelanih nizov povezave v kodo. Ni <>
Brez množine Izogibajte se imenu lastnosti množine vsakega imena tabele v kontekstu. Ni <>

Pritisnite Enter, da ga zaženete in samodejno ustvarite kodo: Če gre za napako, bo prikazan razlog, zato se odzovete glede na vsebino napake.

user Koda modela za tabelo je videti tako:

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; }
}

Mimogrede, opozorilo je prikazano, ker je niz povezave zapisan tako, kot je v kodi ustvarjenega razreda konteksta. Če je mogoče, je treba povezovalni niz shraniti na ločenem mestu in nastaviti v času izvajanja, toda tokrat je to za preverjanje operacije, zato ga bom pustil takšnega, kot je.

Pridobite zapis in si ga oglejte

Zdaj, ko imate kodo za dostop do zapisov v zbirki podatkov, poskusimo pridobiti zapise in jih prikazati v konzoli.

Program.cs in ga spremenite na naslednji način.

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));
}

Ustvarite DbContext samodejno ustvarjen razred new z . Deklariran je v, da omogoča using var samodejno uničenje povezave z bazo podatkov.

dbContext je ustvaril lastnosti za dostop do vsakega modela, tako da lahko tokrat user manipulirate z zapisi v tabeli z dostopom do User lastnosti. Ni vam treba poznati izdanega SQL-ja, ker je samodejno ustvarjen interno.

ToList Tukaj uporabljamo user razširitveno metodo, da dobimo vse zapise v tabeli.

foreach Po tem uporabljam user metode in JsonSerializer.Serialize za prikaz informacij v konzoli. Kot user je navedeno zgoraj, je vsak stolpec v tabeli deklariran kot lastnost, zato je mogoče vrednost pridobiti tudi posamično.