Forbered dig på at få adgang til MySQL med Entity Framework Core (database-først)
Miljø til bekræftelse af handling
- Visual Studio
-
- Visual Studio 2022
- .NET
-
- .NET 8
- Enhed Framework Core
-
- Enhedsramme Core 8.0
- MySQL
-
- MySQL 8,4
- Pomelo.EntityFrameworkCore.MySql
-
- 8.0.2
*Ovenstående er et verifikationsmiljø, men det kan fungere i andre versioner.
Først
Entity Framework Core er et bibliotek med O/R-tilknytninger, der giver dig adgang til databaseposter gennem kodedefinerede modeller (klasser) uden direkte at skrive SQL-sætninger, når du får adgang til databasen. Dette giver følgende fordele:
- Skriver ikke SQL-sætninger direkte, hvilket reducerer sikkerhedsrisici som f.eks. SQL-injektion
- Da SQL-sætninger er strenge, selvom de laver en fejl i syntaksen, er de ikke underlagt kontrol for build-fejl, men da modellen er en programsyntaks, kan den kontrolleres for fejl på build-tidspunktet.
Entity Framework Core genererer automatisk kode til at oprette forbindelse til disse modeller og databaser fra eksisterende databaser, Omvendt er der en måde at manuelt skrive kode og derefter automatisk generere en database.
Førstnævnte kaldes "database-først" og sidstnævnte kaldes "kode-først". Der er også "model-first", der genererer kode og databaser fra tegninger, såsom ER-diagrammer, men det er ikke meget brugt i Entity Framework Core.
Denne gang bruger vi et "database-først"-mønster, der genererer kode ud fra den antagelse, at der allerede findes en database.
MySQL-opsætning
I dette tip skal du sørge for at konfigurere MySQL på forhånd for at få adgang til din MySQL-database. Det kan konfigureres på en pc i dit udviklingsmiljø eller på en anden pc over netværket. Hvis du kan oprette forbindelse til MySQL fra dit udviklingsmiljø, er du godt i gang. I dette tip har vi installeret MySQL i et andet miljø.
MySQL-opsætningstrinene vil blive udeladt, da de vil være overflødige. De følgende sider indeholder MySQL-relaterede tip til opsætningstrin.
Oprettelse af en tabel
I dette tilfælde opretter vi følgende skema (database) og tabel som et eksempel.
- Skemanavn : test_schema
- Tabelnavn : bruger
- Tabelkolonner: [id], [navn], [adgangskode], [alder], [e-mail], [fødselsdag], [is_provisional_registration], [update_datetime]
Det er lige meget, hvordan du skriver det, men hvis det er kedeligt, skal du køre og generere følgende SQL mod MySQL:
Følgende er skemaoprettelse SQL:
CREATE DATABASE `test_schema`;
Oprettelse af tabeller er 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='テストコメント';
Føj en post til 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');
Angiv tilladelser for din konto
Sørg for, at du har konfigureret et værtsnavn, så den konto, du programmerer, kan få adgang til MySQL-skemaet.
Du skal også angive tilladelser for at få adgang til test_schema
den konto, du vil oprette forbindelse til.
Denne gang vil vi udføre SELECT
processen med at hente optegnelserne.
Jeg vil ikke gøre det denne gang, men hvis du vil indsætte eller opdatere, skal du INSERT
UPDATE
tjekke og .
Opsætning af Visual Studio
Forudsat at du allerede har konfigureret det også. Hvis du vil kende opsætningsproceduren, har vi opsummeret den på næste side.
Opret et projekt
Entity Framework Core er ikke afhængig af et bestemt udførelsesmiljø, så det kan bruges i mange projekter. I dette tilfælde bruger vi Entity Framework Core i et simpelt konsolprogrammiljø.
I det nye projekt skal du vælge Konsolapp (alt efter hvad der ikke er .NET Framework).
Du har oprettet projektet. Projektnavnet kan være hvad som helst.
Hent Entity Framework Core-pakken til MySQL
Hent en pakke til at bruge Entity Framework Core med NuGet. Pakken bruger: Dette er ikke officielt fra Microsoft, men det er meget brugt.
- Pomelo.EntityFrameworkCore.MySql
Højreklik på afhængigheden, og vælg Administrer NuGet-pakker.
Med "Gennemse" valgt fra fanen, skriv i søgefeltet Pomelo
. Listen over relaterede pakker vil blive vist.
Installer følgende pakker herfra:
- Pomelo.EntityFrameworkCore.MySql
Vælg, hvad du vil installere, og klik på knappen Installer. Vælg den seneste stabile version for versionen.
Dialogen er grundlæggende OK og fin.
Jeg mener, at pakken er som følger.
Indtast EntityFrameworkCore
derefter søgefeltet, og installer også følgende.
- Microsoft.EntityFrameworkCore.Tools
For versioner skal du matche den version, Pomelo.EntityFrameworkCore.MySql
der refereres Microsoft.EntityFrameworkCore
til af .
Denne gang henviser vi til 8.0.2, så Microsoft.EntityFrameworkCore.Tools
lad os også gøre det til 8.0.2.
Denne pakke bruges til at generere kode fra databasen.
I sidste ende skal det se sådan ud:
Oprette en model (kode) fra en databasetabelkonfiguration
Hvis du vil have din model og anden kode genereret automatisk, skal du først oprette dit projekt for at sikre, at der ikke er nogen fejl. Hvis der er en fejl, vil modellen mislykkes. Hvis du allerede har bekræftet, at der ikke er nogen fejl, behøver du ikke at bygge.
Åbn Package Manager-konsollen fra Visual Studio. Hvis ikke, kan du åbne den fra menuen Værktøjer, NuGet Package Manager og Package Manager Console.
Du vil se et vindue som det nedenfor, så sørg for, at "Standardprojekt" i øverste højre hjørne er det projekt, du vil oprette modellen til. (Du skal være forsigtig, hvis du har flere projekter)
Indtast følgende tekst i indtastningsfeltet: Parametrene vil ændre sig afhængigt af miljøet, så skift dem rettidigt baseret på følgende forklaringer.
Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Eksempel på 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
Eksempel på | parameterforklaring | |
---|---|---|
Udbyder | Hvis det er Pomelo.EntityFrameworkCore.MySql MySQL, skal du angive såsom. |
Pomelo.EntityFrameworkCore.MySql |
Forbindelse | Dette er forbindelsesstrengen til at oprette forbindelse til databasen. Forbindelsesstrengen kan bruges i andre apps, så skriv venligst det angivne indhold i henhold til forbindelsesstrengens notation. Den bruges i øvrigt kun midlertidigt til at oprette en model, så der er ingen grund til at være opmærksom på sikkerheden efter udgivelse af appen til denne forbindelsesstreng. Hvis du har et symbol i din adgangskode, skal du være forsigtig med escape. | "Server=TestServer; Database=test_schema; bruger=test-bruger; adgangskode=XXXXXXXX;" |
f | Gennemtving overskrivning, selvom du allerede har et program. | Ingen <> |
OutputDir | Mappestien til at udskrive koden. Relativ sti fra projektmappen | Modeller\Database |
Sammenhæng | Kontekstklassenavne ved brug af Entity Framework | TestDatabaseDbContext |
BrugDatabasenavne | Hvis det er angivet, vil tabelnavnet i databasen være klassenavnet, som det er. Hvis ikke, justeres tilfældet med enhedsklassenavnet i henhold til reglerne. | Ingen <> |
DataAnmærkninger | Hvis det er angivet, føjer kolonnetypen automatisk attributten DataAnnotation til hver egenskab. Dette er lidt nyttigt, hvis du automatisk vil udføre inputkontrol i henhold til databasetypen. | Ingen <> |
Namespace | Det navneområde, som den genererede objektklasse tilhører. Hvis det ikke er angivet, bestemmes navneområdet i henhold til mappen. | TestNamespace |
Kontekstnavnområde | Det navneområde, som den genererede kontekst tilhører. Hvis det ikke er angivet, bestemmes navneområdet i henhold til mappen. | TestNamespace |
NoOnConfiguring | Undgå at integrere rå forbindelsesstrenge i din kode. | Ingen <> |
NejFlertal | Undgå flertalsegenskabsnavnet for hvert tabelnavn i konteksten. | Ingen <> |
Tryk på Enter for at køre den og automatisk generere koden: Hvis det er en fejl, vil årsagen blive vist, så svar venligst i henhold til indholdet af fejlen.
user
Modelkoden for tabellen ser sådan ud:
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; }
}
Advarslen vises i øvrigt, fordi forbindelsesstrengen skrives, som den er i koden for den genererede kontekstklasse. Hvis det er muligt, skal forbindelsesstrengen gemmes et separat sted og indstilles ved kørsel, men denne gang er det med det formål at kontrollere operationen, så jeg lader det være, som det er.
Hent en post, og se den
Nu hvor du har koden til at få adgang til posterne i databasen, lad os prøve at hente posterne og få dem vist i konsollen.
Program.cs
og ændre den som følger.
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));
}
Generer den DbContext
automatisk genererede klasse new
med . Den er erklæret i for at tillade using var
, at databaseforbindelsen automatisk ødelægges.
dbContext
har genereret egenskaber for at få adgang til hver model, så denne gang user
kan du manipulere posterne i tabellen ved User
at få adgang til egenskaberne.
Du behøver ikke at være opmærksom på den SQL, der udstedes, fordi den automatisk genereres internt.
ToList
Her bruger user
vi en udvidelsesmetode til at hente alle posterne i tabellen.
foreach
Derefter bruger user
jeg metoderne og JsonSerializer.Serialize
til at vise oplysningerne i konsollen.
Som user
nævnt ovenfor er hver kolonne i tabellen deklareret som en egenskab, så det er også muligt at hente værdien enkeltvis.