Bereid je voor op toegang tot MySQL met Entity Framework Core (database-eerst)
Omgeving voor bevestiging van de bewerking
- Visuele Studio
-
- Visuele Studio 2022
- .NET
-
- .NET 8
- Entiteit Framework Core
-
- Entiteit Framework Core 8.0
- MySQL
-
- MySQL 8.4
- Pomelo.EntityFrameworkCore.MySql
-
- 8.0.2
*Het bovenstaande is een verificatieomgeving, maar het kan ook in andere versies werken.
Eerst
Entity Framework Core is een bibliotheek met O/R-mappers waarmee u toegang hebt tot databaserecords via door code gedefinieerde modellen (klassen) zonder rechtstreeks SQL-instructies te schrijven bij het openen van de database. Dit levert de volgende voordelen op:
- Schrijft geen SQL-instructies rechtstreeks, waardoor beveiligingsrisico's zoals SQL-injectie worden verminderd
- Aangezien SQL-instructies tekenreeksen zijn, hoeven ze, zelfs als ze een fout maken in de syntaxis, niet te worden gecontroleerd op buildfouten, maar aangezien het model een programmasyntaxis is, kan het tijdens het bouwen op fouten worden gecontroleerd.
Entity Framework Core genereert automatisch code om verbinding te maken met deze modellen en databases uit bestaande databases, Omgekeerd is er een manier om handmatig code te schrijven en vervolgens automatisch een database te genereren.
De eerste wordt "database-first" genoemd en de laatste wordt "code-first" genoemd. Er is ook "model-first" dat code en databases genereert op basis van blauwdrukken, zoals ER-diagrammen, maar het wordt niet veel gebruikt in Entity Framework Core.
Deze keer gebruiken we een 'database-first'-patroon dat code genereert in de veronderstelling dat er al een database bestaat.
MySQL-installatie
In deze tip, zorg ervoor dat je MySQL van tevoren instelt om toegang te krijgen tot je MySQL-database. Het kan worden ingesteld op een pc in uw ontwikkelomgeving of op een andere pc via het netwerk. Als je vanuit je ontwikkelomgeving verbinding kunt maken met MySQL, ben je klaar om te gaan. In deze tip hebben we MySQL in een andere omgeving geïnstalleerd.
De installatiestappen van MySQL worden weggelaten omdat ze overbodig zijn. De volgende pagina's bevatten MySQL-gerelateerde tips voor installatiestappen.
Een tabel maken
In dit geval maken we het volgende schema (database) en de volgende tabel als voorbeeld.
- Schema Naam : test_schema
- Tabelnaam : gebruiker
- Tabelkolommen : [id], [naam], [wachtwoord], [leeftijd], [e-mail], [verjaardag], [is_provisional_registration], [update_datetime]
Het maakt niet uit hoe je het schrijft, maar als het vervelend is, voer dan de volgende SQL uit en genereer deze tegen MySQL:
Het volgende is schemacreatie SQL:
CREATE DATABASE `test_schema`;
Het maken van tabellen is 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='テストコメント';
Voeg een record toe aan 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');
Rechten instellen voor uw account
Zorg ervoor dat u een hostnaam hebt ingesteld, zodat het account dat u programmeert toegang heeft tot het MySQL-schema.
U moet ook machtigingen instellen om toegang te test_schema
krijgen tot het account waarmee u verbinding wilt maken.
Deze keer zullen we het proces van het ophalen van de records uitvoeren SELECT
.
Ik zal het deze keer niet doen, maar als je INSERT
UPDATE
wilt invoegen of bijwerken, controleer dan en .
Visual Studio-instellingen
Ervan uitgaande dat je het ook al hebt ingesteld. Als u de installatieprocedure wilt weten, hebben we deze op de volgende pagina samengevat.
Maak een project aan
Entity Framework Core is niet afhankelijk van een specifieke uitvoeringsomgeving, dus het kan in veel projecten worden gebruikt. In dit geval gebruiken we Entity Framework Core in een eenvoudige console-applicatieomgeving.
Selecteer in het nieuwe project de optie Console-app (afhankelijk van wat niet .NET Framework is).
U hebt het project gemaakt. De projectnaam kan van alles zijn.
Download het Entity Framework Core-pakket voor MySQL
Download een pakket om Entity Framework Core te gebruiken met NuGet. Het pakket maakt gebruik van: Dit is niet officieel van Microsoft, maar het wordt veel gebruikt.
- Pomelo.EntityFrameworkCore.MySql
Klik met de rechtermuisknop op de afhankelijkheid en selecteer NuGet-pakketten beheren.
Selecteer "Bladeren" op het tabblad en typ in het zoekveld Pomelo
. De lijst met gerelateerde pakketten wordt weergegeven.
Installeer hieruit de volgende pakketten:
- Pomelo.EntityFrameworkCore.MySql
Selecteer wat u wilt installeren en klik op de knop Installeren. Selecteer de nieuwste stabiele versie voor de versie.
De dialoog is in principe OK en prima.
Ik denk dat het pakket als volgt is.
Typ EntityFrameworkCore
vervolgens in het zoekveld en installeer ook het volgende.
- Microsoft.EntityFrameworkCore.Tools
Voor versies komt Pomelo.EntityFrameworkCore.MySql
u overeen met de versie waarnaar Microsoft.EntityFrameworkCore
wordt verwezen door .
Deze keer hebben we het over 8.0.2, dus Microsoft.EntityFrameworkCore.Tools
laten we er ook 8.0.2 van maken.
Dit pakket wordt gebruikt om code uit de database te genereren.
Uiteindelijk zou het er zo uit moeten zien:
Een model (code) maken op basis van een databasetabelconfiguratie
Als u uw model en andere code automatisch wilt laten genereren, moet u eerst uw project bouwen om er zeker van te zijn dat er geen fouten zijn. Als er een fout optreedt, mislukt het model. Als u al hebt geverifieerd dat er geen fouten zijn, hoeft u niet te bouwen.
Open de Package Manager-console vanuit Visual Studio. Als dit niet het geval is, kunt u het openen vanuit het menu Extra, NuGet Package Manager en Package Manager Console.
U ziet een venster zoals hieronder, dus zorg ervoor dat het "Standaardproject" in de rechterbovenhoek het project is waarvoor u het model wilt maken. (Je moet voorzichtig zijn als je meerdere projecten hebt)
Voer de volgende tekst in het invoerveld in: De parameters veranderen afhankelijk van de omgeving, dus wijzig ze tijdig op basis van de volgende uitleg.
Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Invoer Voorbeeld
Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Parameter | Uitleg | Parameter Voorbeeld |
---|---|---|
Aanbieder | Als het MySQL is Pomelo.EntityFrameworkCore.MySql , geef dan op zoals. |
Pomelo.EntityFrameworkCore.MySql |
Verbinding | Dit is de verbindingsreeks om verbinding te maken met de database. De verbindingsreeks kan in andere apps worden gebruikt, dus schrijf de opgegeven inhoud volgens de notatie van de verbindingsreeks. Overigens wordt het alleen tijdelijk gebruikt om een model te maken, dus het is niet nodig om op de hoogte te zijn van de beveiliging na het publiceren van de app voor deze verbindingsreeks. Als u een symbool in uw wachtwoord heeft, wees dan voorzichtig met ontsnappen. | "Server=TestServer; Databank=test_schema; gebruiker=test-gebruiker; wachtwoord=XXXXXXXX;" |
f | Forceer overschrijven, zelfs als u al een programma hebt. | Geen <> |
Uitvoer Dir | Het mappad om de code uit te voeren. Relatief pad vanuit de projectmap | Modellen\Database |
Context | Namen van contextklassen bij het gebruik van Entity Framework | TestDatabaseDbContext |
UseDatabaseNames | Als deze optie is opgegeven, is de tabelnaam in de database de klassenaam zoals deze is. Als dit niet het geval is, wordt het hoofdlettergebruik van de naam van de entiteitsklasse aangepast volgens de regels. | Geen <> |
Gegevensannotaties | Indien opgegeven, wordt aan het kolomtype automatisch het kenmerk DataAnnotation toegevoegd aan elke eigenschap. Dit is een beetje handig als u automatisch invoercontroles wilt uitvoeren op basis van het type database. | Geen <> |
Namespace | De naamruimte waartoe de gegenereerde entiteitsklasse behoort. Als dit niet is opgegeven, wordt de naamruimte bepaald op basis van de map. | TestNaamruimte |
ContextNaamruimte | De naamruimte waartoe de gegenereerde context behoort. Als dit niet is opgegeven, wordt de naamruimte bepaald op basis van de map. | TestNaamruimte |
NoOnConfigureren | Vermijd het insluiten van onbewerkte verbindingsreeksen in uw code. | Geen <> |
Nee Meervoud | Vermijd de eigenschapsnaam in het meervoud van elke tabelnaam in de context. | Geen <> |
Druk op Enter om het uit te voeren en de code automatisch te genereren: Als het een fout is, wordt de reden weergegeven, dus reageer alstublieft op basis van de inhoud van de fout.
user
De modelcode voor de tabel ziet er als volgt uit:
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; }
}
Trouwens, de waarschuwing wordt weergegeven omdat de connection string is geschreven zoals in de code van de gegenereerde contextklasse. Indien mogelijk moet de verbindingsstring op een aparte plaats worden opgeslagen en tijdens runtime worden ingesteld, maar deze keer is het om de werking te controleren, dus ik laat het zoals het is.
Haal een record op en bekijk het
Nu u de code hebt om toegang te krijgen tot de records in de database, gaan we proberen de records op te halen en weer te geven in de console.
Program.cs
en wijzig het als volgt.
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));
}
Genereer de DbContext
automatisch gegenereerde klasse new
met . Het wordt aangegeven om de databaseverbinding automatisch te vernietigen using var
.
dbContext
heeft eigenschappen gegenereerd om toegang te krijgen tot elk model, zodat u deze keer user
de records in de tabel kunt manipuleren door User
de eigenschappen te openen.
U hoeft niet op de hoogte te zijn van de SQL die wordt uitgegeven, omdat deze automatisch intern wordt gegenereerd.
ToList
Hier gebruiken user
we een extensiemethode om alle records in de tabel te krijgen.
foreach
Daarna gebruik user
ik de en JsonSerializer.Serialize
methoden om de informatie in de console weer te geven.
Zoals user
hierboven vermeld, wordt elke kolom in de tabel gedeclareerd als een eigenschap, dus het is ook mogelijk om de waarde afzonderlijk op te halen.