Pasirengimas prieigai prie "MySQL" naudojant "Entity Framework Core" (pirmiausia duomenų bazė)

Puslapio sukūrimo data :

Operacijos patvirtinimo aplinka

Vizualinė studija
  • Vizualinė studija 2022 m
.GRYNOJI
  • .NET 8
Objekto struktūros branduolys
  • "Entity Framework Core 8.0"
MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Aukščiau pateikta patvirtinimo aplinka, tačiau ji gali veikti ir kitose versijose.

Iš pradžių

Entity Framework Core yra O/R žemėlapių biblioteka, leidžianti pasiekti duomenų bazės įrašus naudojant kodu apibrėžtus modelius (klases) tiesiogiai nerašant SQL sakinių prisijungiant prie duomenų bazės. Tai suteikia šiuos privalumus:

  • Nerašo SQL sakinių tiesiogiai, sumažindamas saugumo riziką, pvz., SQL injekciją
  • Kadangi SQL sakiniai yra eilutės, net jei jie padaro sintaksės klaidą, jie nėra tikrinami, ar nėra kūrimo klaidų, tačiau kadangi modelis yra programos sintaksė, jį galima patikrinti, ar nėra klaidų kūrimo metu.

Entity Framework Core automatiškai generuoja kodą, kad prisijungtų prie šių modelių ir duomenų bazių iš esamų duomenų bazių, Ir atvirkščiai, yra būdas rankiniu būdu parašyti kodą ir automatiškai sugeneruoti duomenų bazę.

Pirmasis vadinamas "duomenų bazės pirmiausia", o antrasis - "kodas pirmas". Taip pat yra "modelis", kuris generuoja kodą ir duomenų bazes iš brėžinių, pvz., ER diagramų, tačiau jis nėra plačiai naudojamas "Entity Framework Core".

Šį kartą naudosime "duomenų bazės pirmiausia" modelį, kuris generuoja kodą darant prielaidą, kad duomenų bazė jau egzistuoja.

MySQL sąranka

Šiame patarime įsitikinkite, kad iš anksto nustatėte MySQL, kad galėtumėte pasiekti savo MySQL duomenų bazę. Jį galima nustatyti kompiuteryje kūrimo aplinkoje arba kitame kompiuteryje per tinklą. Jei galite prisijungti prie MySQL iš savo kūrimo aplinkos, galite pradėti. Šiame patarime įdiegėme "MySQL" kitoje aplinkoje.

MySQL sąrankos veiksmai bus praleisti, nes jie bus nereikalingi. Tolesniuose puslapiuose pateikiami su MySQL susiję sąrankos veiksmų patarimai.

Lentelės kūrimas

Tokiu atveju kaip pavyzdį sukursime šią schemą (duomenų bazę) ir lentelę.

  • Schemos pavadinimas : test_schema
  • Lentelės pavadinimas : vartotojas
  • Lentelės stulpeliai: [id], [vardas], [slaptažodis], [amžius], [el. paštas], [gimtadienis], [is_provisional_registration], [update_datetime]

Nesvarbu, kaip jį rašote, bet jei tai vargina, paleiskite ir sugeneruokite šį SQL prieš MySQL:

Toliau pateikiamas schemos kūrimas SQL:

CREATE DATABASE `test_schema`;

Lentelės kūrimas yra 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='テストコメント';

Įtraukite įrašą į 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');

Paskyros leidimų nustatymas

Įsitikinkite, kad nustatėte pagrindinio kompiuterio pavadinimą, kad jūsų programuojama paskyra galėtų pasiekti MySQL schemą.

Taip pat turite nustatyti leidimus test_schema pasiekti paskyrą, prie kurios norite prisijungti.

Šį kartą atliksime SELECT įrašų gavimo procesą. Šį kartą to nedarysiu, bet jei norite INSERT UPDATE įterpti ar atnaujinti, pažymėkite ir .

"Visual Studio" sąranka

Darant prielaidą, kad jūs jau jį taip pat nustatėte. Jei norite sužinoti sąrankos procedūrą, mes ją apibendrinome kitame puslapyje.

Sukurkite projektą

"Entity Framework Core" nepriklauso nuo konkrečios vykdymo aplinkos, todėl ją galima naudoti daugelyje projektų. Tokiu atveju naudosime "Entity Framework Core" paprastoje konsolės programų aplinkoje.

Naujame projekte pasirinkite Konsolės programa (atsižvelgiant į tai, kas nėra .NET Framework).

Jūs sukūrėte projektą. Projekto pavadinimas gali būti bet koks.

Gaukite "Entity Framework Core" paketą, skirtą "MySQL"

Gaukite paketą, kad galėtumėte naudoti "Entity Framework Core" su "NuGet". Pakuotėje naudojami: Tai nėra oficiali "Microsoft", tačiau ji plačiai naudojama.

  • Pomelo.EntityFrameworkCore.MySql

Dešiniuoju pelės mygtuku spustelėkite priklausomybę ir pasirinkite Tvarkyti NuGet paketus.

Skirtuke pasirinkę "Naršyti", įveskite paieškos laukelį Pomelo . Bus rodomas susijusių paketų sąrašas.

Iš to įdiekite šiuos paketus:

  • Pomelo.EntityFrameworkCore.MySql

Pasirinkite, ką norite įdiegti, ir spustelėkite mygtuką Įdiegti. Pasirinkite naujausią stabilią versijos versiją.

Dialogas iš esmės yra gerai ir gerai.

Manau, kad paketas yra toks.

Tada įveskite EntityFrameworkCore paieškos laukelį ir įdiekite šiuos dalykus.

  • Microsoft.EntityFrameworkCore.Tools

Jei naudojate versijas, Pomelo.EntityFrameworkCore.MySql suderinkite su versija, kurią nurodo Microsoft.EntityFrameworkCore . Šį kartą mes kalbame apie 8.0.2, todėl Microsoft.EntityFrameworkCore.Tools padarykime jį ir 8.0.2. Šis paketas naudojamas generuoti kodą iš duomenų bazės.

Galų gale tai turėtų atrodyti taip:

Modelio (kodo) kūrimas iš duomenų bazės lentelės konfigūracijos

Norėdami, kad modelis ir kitas kodas būtų sugeneruoti automatiškai, pirmiausia turite sukurti projektą, kad įsitikintumėte, jog nėra klaidų. Jei įvyks klaida, modelis suges. Jei jau patikrinote, ar nėra klaidų, jums nereikia kurti.

Atidarykite paketų tvarkyklės konsolę iš "Visual Studio". Jei ne, galite jį atidaryti iš meniu Įrankiai, NuGet paketų tvarkyklė ir Paketų tvarkyklės konsolė.

Pamatysite tokį langą kaip žemiau, todėl įsitikinkite, kad viršutiniame dešiniajame kampe esantis "Numatytasis projektas" yra projektas, kuriam norite sukurti modelį. (Turite būti atsargūs, jei turite kelis projektus)

Įvesties lauke įveskite šį tekstą: Parametrai keisis priklausomai nuo aplinkos, todėl pakeiskite juos laiku, remdamiesi toliau pateiktais paaiškinimais.

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

Įvesties pavyzdys

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Parametro paaiškinimas Parametro pavyzdys
Teikėjas Jei tai MySQL Pomelo.EntityFrameworkCore.MySql , nurodykite pvz. Pomelo.EntityFrameworkCore.MySql
Ryšys Tai ryšio eilutė, skirta prisijungti prie duomenų bazės. Ryšio eilutę galima naudoti kitose programose, todėl parašykite nurodytą turinį pagal ryšio eilutės žymėjimą. Beje, jis naudojamas tik laikinai modeliui kurti, todėl paskelbus šios ryšio eilutės programą nereikia žinoti apie saugumą. Jei slaptažodyje yra simbolis, būkite atsargūs dėl pabėgimo. "Server=TestServer; Duomenų bazė = test_schema; vartotojas=bandomasis vartotojas; slaptažodis=XXXXXXXX;"
f Priverstinai perrašyti, net jei jau turite programą. Nėra <>
IšvestisDir Aplanko kelias, kuriame bus išvestas kodas. Santykinis kelias iš projekto aplanko Modeliai\Duomenų bazė
Kontekste Konteksto klasių pavadinimai naudojant objektų sistemą TestDatabaseDbContext
UseDatabaseNames Jei nurodyta, lentelės pavadinimas duomenų bazėje bus toks, koks yra. Jei ne, subjekto klasės pavadinimo atvejis koreguojamas pagal taisykles. Nėra <>
Duomenų komentarai Jei nurodyta, stulpelio tipas automatiškai prideda atributą DataAnnotation prie kiekvienos ypatybės. Tai šiek tiek naudinga, jei norite automatiškai atlikti įvesties tikrinimą pagal duomenų bazės tipą. Nėra <>
Namespace Vardų sritis, kuriai priklauso sugeneruota objekto klasė. Jei nenurodyta, vardų sritis nustatoma pagal aplanką. Testo vardų sritis
Konteksto vardų sritis Vardų sritis, kuriai priklauso sugeneruotas kontekstas. Jei nenurodyta, vardų sritis nustatoma pagal aplanką. Testo vardų sritis
NoOnConfiguring Venkite į kodą įterpti neapdorotų ryšio eilučių. Nėra <>
NoPliuralizuoti Venkite kiekvieno lentelės pavadinimo daugiskaitos ypatybės pavadinimo kontekste. Nėra <>

Paspauskite Enter, kad jį paleistumėte ir automatiškai sugeneruotumėte kodą: Jei tai klaida, bus rodoma priežastis, todėl atsakykite pagal klaidos turinį.

user Lentelės modelio kodas atrodo taip:

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

Beje, įspėjimas rodomas, nes ryšio eilutė parašyta tokia, kokia ji yra sugeneruotos konteksto klasės kode. Jei įmanoma, ryšio eilutę reikia laikyti atskiroje vietoje ir nustatyti vykdymo metu, tačiau šį kartą ji skirta operacijai patikrinti, todėl paliksiu ją tokią, kokia yra.

Įrašo gavimas ir peržiūra

Dabar, kai turite kodą, kad galėtumėte pasiekti duomenų bazės įrašus, pabandykime gauti įrašus ir rodyti juos konsolėje.

Program.cs ir pakeiskite jį taip.

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

Generuokite DbContext automatiškai sugeneruotą klasę new naudodami . Jis deklaruojamas, kad using var duomenų bazės ryšys būtų automatiškai sunaikintas.

dbContext sugeneravo ypatybes, kad galėtumėte pasiekti kiekvieną modelį, todėl šį kartą user galite manipuliuoti lentelės User įrašais pasiekdami ypatybes. Jums nereikia žinoti apie išduodamą SQL, nes jis automatiškai sugeneruojamas viduje.

ToList Čia mes naudojame user išplėtimo metodą, kad gautume visus lentelės įrašus.

foreach Po to naudoju user ir JsonSerializer.Serialize metodus, kad parodyčiau informaciją konsolėje. Kaip user minėta aukščiau, kiekvienas lentelės stulpelis deklaruojamas kaip ypatybė, todėl vertę taip pat galima nuskaityti atskirai.