Vorbereiten des Zugriffs auf MySQL mit Entity Framework Core (Datenbank-First)

Erstellungsdatum der Seite :

Umgebung für die Betriebsbestätigung

Visuelles Studio
  • Visual Studio 2022
.NETTO
  • .NET 8
Entity Framework Kern
  • Entity Framework Core 8.0
MySQL (Englisch)
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Bei der obigen Version handelt es sich um eine Verifizierungsumgebung, die jedoch möglicherweise in anderen Versionen funktioniert.

Zuerst

Entity Framework Core ist eine Bibliothek von O/R-Mappern, mit denen Sie über codedefinierte Modelle (Klassen) auf Datenbankdatensätze zugreifen können, ohne beim Zugriff auf die Datenbank direkt SQL-Anweisungen schreiben zu müssen. Dies bietet folgende Vorteile:

  • Schreibt SQL-Anweisungen nicht direkt, wodurch Sicherheitsrisiken wie SQL-Injection reduziert werden
  • Da SQL-Anweisungen Zeichenfolgen sind, können sie, selbst wenn sie einen Fehler in der Syntax enthalten, nicht auf Buildfehler überprüft werden, aber da es sich bei dem Modell um eine Programmsyntax handelt, kann es zur Buildzeit auf Fehler überprüft werden.

Entity Framework Core generiert automatisch Code, um eine Verbindung mit diesen Modellen und Datenbanken aus vorhandenen Datenbanken herzustellen. Umgekehrt gibt es eine Möglichkeit, Code manuell zu schreiben und dann automatisch eine Datenbank zu generieren.

Ersteres wird als "Database-First" und Letzteres als "Code-First" bezeichnet. Es gibt auch "Model-First", das Code und Datenbanken aus Blaupausen generiert, z. B. ER-Diagramme, aber es wird in Entity Framework Core nicht häufig verwendet.

Dieses Mal verwenden wir ein "Database-First"-Muster, das Code unter der Annahme generiert, dass bereits eine Datenbank vorhanden ist.

MySQL-Einrichtung

In diesem Tipp stellen Sie sicher, dass Sie MySQL vorher für den Zugriff auf Ihre MySQL-Datenbank eingerichtet haben. Es kann auf einem PC in Ihrer Entwicklungsumgebung oder auf einem anderen PC über das Netzwerk eingerichtet werden. Wenn Sie von Ihrer Entwicklungsumgebung aus eine Verbindung zu MySQL herstellen können, können Sie loslegen. In diesem Tipp haben wir MySQL in einer anderen Umgebung installiert.

Die MySQL-Einrichtungsschritte entfallen, da sie redundant sind. Auf den folgenden Seiten finden Sie MySQL-bezogene Tipps für Einrichtungsschritte.

Erstellen einer Tabelle

In diesem Fall erstellen wir das folgende Schema (Datenbank) und die folgende Tabelle als Beispiel.

  • Name des Schemas: test_schema
  • Name der Tabelle : Benutzer
  • Tabellenspalten : [id], [name], [password], [age], [email], [birthday], [is_provisional_registration], [update_datetime]

Es spielt keine Rolle, wie Sie es schreiben, aber wenn es mühsam ist, führen Sie das folgende SQL für MySQL aus und generieren Sie es:

Im Folgenden finden Sie SQL zur Schemaerstellung:

CREATE DATABASE `test_schema`;

Die Tabellenerstellung erfolgt in 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ügen Sie SQL einen Datensatz hinzu.

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

Festlegen von Berechtigungen für Ihr Konto

Stellen Sie sicher, dass Sie einen Hostnamen eingerichtet haben, damit das Konto, das Sie programmieren, auf das MySQL-Schema zugreifen kann.

Sie müssen auch Berechtigungen für den Zugriff auf test_schema das Konto festlegen, mit dem Sie eine Verbindung herstellen möchten.

Dieses Mal führen wir den Vorgang des Abrufens der Datensätze durch SELECT . Ich werde es dieses Mal nicht tun, aber wenn Sie INSERT UPDATE einfügen oder aktualisieren möchten, überprüfen Sie bitte und .

Visual Studio-Einrichtung

Vorausgesetzt, Sie haben es bereits eingerichtet. Wenn Sie wissen möchten, wie die Einrichtung vorgeht, haben wir diese auf der folgenden Seite zusammengefasst.

Erstellen eines Projekts

Entity Framework Core ist nicht von einer bestimmten Ausführungsumgebung abhängig und kann daher in vielen Projekten verwendet werden. In diesem Fall verwenden wir Entity Framework Core in einer einfachen Konsolenanwendungsumgebung.

Wählen Sie im neuen Projekt Konsolen-App aus (je nachdem, was nicht .NET Framework ist).

Sie haben das Projekt angelegt. Der Projektname kann beliebig sein.

Holen Sie sich das Entity Framework Core-Paket für MySQL

Rufen Sie ein Paket ab, um Entity Framework Core mit NuGet zu verwenden. Das Paket verwendet: Dies ist nicht offiziell von Microsoft, aber es ist weit verbreitet.

  • Pomelo.EntityFrameworkCore.MySql

Klicken Sie mit der rechten Maustaste auf die Abhängigkeit, und wählen Sie NuGet-Pakete verwalten aus.

Wählen Sie auf der Registerkarte "Durchsuchen" aus und geben Sie in das Suchfeld Pomelo ein. Die Liste der zugehörigen Pakete wird angezeigt.

Installieren Sie die folgenden Pakete von diesem:

  • Pomelo.EntityFrameworkCore.MySql

Wählen Sie aus, was Sie installieren möchten, und klicken Sie auf die Schaltfläche Installieren. Wählen Sie die neueste stabile Version für die Version aus.

Der Dialog ist grundsätzlich in Ordnung und in Ordnung.

Ich denke, das Paket sieht wie folgt aus.

Geben Sie dann etwas in das Suchfeld ein EntityFrameworkCore und installieren Sie auch Folgendes.

  • Microsoft.EntityFrameworkCore.Tools

Stimmen Sie bei Versionen mit der Version überein, Pomelo.EntityFrameworkCore.MySql auf die von verwiesen Microsoft.EntityFrameworkCore wird. Dieses Mal beziehen wir uns auf 8.0.2, also Microsoft.EntityFrameworkCore.Tools machen wir es auch zu 8.0.2. Dieses Paket wird verwendet, um Code aus der Datenbank zu generieren.

Am Ende sollte es so aussehen:

Erstellen eines Modells (Code) aus einer Datenbanktabellenkonfiguration

Damit das Modell und anderer Code automatisch generiert werden, müssen Sie zuerst das Projekt erstellen, um sicherzustellen, dass keine Fehler vorliegen. Wenn ein Fehler auftritt, schlägt das Modell fehl. Wenn Sie bereits überprüft haben, dass keine Fehler vorhanden sind, müssen Sie nicht erstellen.

Öffnen Sie die Paket-Manager-Konsole in Visual Studio. Wenn nicht, können Sie es über das Menü Extras, NuGet-Paket-Manager und Paket-Manager-Konsole öffnen.

Sie sehen ein Fenster wie das untenstehende, also stellen Sie sicher, dass das "Standardprojekt" in der oberen rechten Ecke das Projekt ist, für das Sie das Modell erstellen möchten. (Sie müssen vorsichtig sein, wenn Sie mehrere Projekte haben)

Geben Sie folgenden Text in das Eingabefeld ein: Die Parameter ändern sich je nach Umgebung, daher sollten Sie sie rechtzeitig auf der Grundlage der folgenden Erläuterungen ändern.

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

Eingabe-Beispiel

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Erläuterung der Parameter Beispiel für einen Parameter
Anbieter Wenn es sich um MySQL handelt Pomelo.EntityFrameworkCore.MySql , geben Sie wie folgt an. Pomelo.EntityFrameworkCore.MySql
Verbindung Dies ist die Verbindungszeichenfolge für die Verbindung mit der Datenbank. Die Verbindungszeichenfolge kann in anderen Apps verwendet werden, daher schreiben Sie bitte den angegebenen Inhalt entsprechend der Schreibweise der Verbindungszeichenfolge. Es wird übrigens nur temporär verwendet, um ein Modell zu erstellen, so dass es nicht notwendig ist, nach der Veröffentlichung der App für diese Verbindungszeichenfolge auf die Sicherheit zu achten. Wenn Sie ein Symbol in Ihrem Passwort haben, seien Sie vorsichtig mit Escape. "Server=TestServer; Datenbank= test_schema; user=Test-Benutzer; password=XXXXXXXX;"
f Erzwingen Sie das Überschreiben, auch wenn Sie bereits ein Programm haben. Keine <>
Ausgabe-Verzeichnis Der Ordnerpfad für die Ausgabe des Codes. Relativer Pfad aus dem Projektordner Modelle\Datenbank
Zusammenhang Namen von Kontextklassen bei Verwendung von Entity Framework TestDatabaseDbContext
UseDatabaseNames Wenn angegeben, ist der Tabellenname in der Datenbank der Klassenname, wie er ist. Ist dies nicht der Fall, wird die Groß-/Kleinschreibung des Namens der Entitätsklasse gemäß den Regeln angepasst. Keine <>
DataAnnotations Wenn angegeben, fügt der Spaltentyp automatisch das DataAnnotation-Attribut an jede Eigenschaft an. Dies ist ein wenig nützlich, wenn Sie die Eingabeprüfung automatisch entsprechend dem Typ der Datenbank durchführen möchten. Keine <>
Namespace Der Namespace, zu dem die generierte Entitätsklasse gehört. Wenn nicht angegeben, wird der Namensraum entsprechend dem Ordner bestimmt. TestNamespace
ContextNamespace Der Namespace, zu dem der generierte Context gehört. Wenn nicht angegeben, wird der Namensraum entsprechend dem Ordner bestimmt. TestNamespace
NoOnKonfigurieren Vermeiden Sie das Einbetten von unformatierten Verbindungszeichenfolgen in Ihren Code. Keine <>
NoPluralize Vermeiden Sie den Plural des Eigenschaftsnamens der einzelnen Tabellennamen im Kontext. Keine <>

Drücken Sie die Eingabetaste, um es auszuführen und den Code automatisch zu generieren: Wenn es sich um einen Fehler handelt, wird der Grund angezeigt, also reagieren Sie bitte entsprechend dem Inhalt des Fehlers.

user Der Modellcode für die Tabelle sieht wie folgt aus:

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

Die Warnung wird übrigens angezeigt, weil der Verbindungsstring so geschrieben ist, wie er im Code der generierten Kontextklasse steht. Wenn möglich, sollte die Verbindungszeichenfolge an einem separaten Ort gespeichert und zur Laufzeit festgelegt werden, aber dieses Mal dient sie dem Zweck, den Vorgang zu überprüfen, daher werde ich sie so lassen, wie sie ist.

Holen Sie sich einen Datensatz und sehen Sie ihn an

Nachdem Sie nun über den Code für den Zugriff auf die Datensätze in der Datenbank verfügen, versuchen wir, die Datensätze abzurufen und in der Konsole anzuzeigen.

Program.cs und ändern Sie sie wie folgt.

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

Generieren Sie die DbContext automatisch generierte Klasse new mit . Sie ist in, damit die Datenbankverbindung automatisch zerstört werden kann using var .

dbContext hat Eigenschaften für den Zugriff auf die einzelnen Modelle generiert, sodass Sie dieses Mal user die Datensätze in der Tabelle bearbeiten können, indem User Sie auf die Eigenschaften zugreifen. Sie müssen sich nicht über die ausgegebene SQL im Klaren sein, da sie intern automatisch generiert wird.

ToList Hier verwenden user wir eine Erweiterungsmethode, um alle Datensätze in der Tabelle abzurufen.

foreach Danach verwende user ich die Methoden undJsonSerializer.Serialize, um die Informationen in der Konsole anzuzeigen. Wie user oben erwähnt, wird jede Spalte in der Tabelle als Eigenschaft deklariert, so dass es auch möglich ist, den Wert einzeln abzurufen.