Préparation de l’accès à MySQL avec Entity Framework Core (base de données d’abord)

Date de création de la page :

Environnement de confirmation de l’opération

Studio visuel
  • Visual Studio 2022
.FILET
  • .NET 8
Noyau d’Entity Framework
  • Entity Framework Core 8.0
MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Ce qui précède est un environnement de vérification, mais il peut fonctionner dans d’autres versions.

Au début

Entity Framework Core est une bibliothèque de mappeurs O/R qui vous permet d’accéder aux enregistrements de base de données par le biais de modèles définis par le code (classes) sans écrire directement d’instructions SQL lors de l’accès à la base de données. Cela offre les avantages suivants :

  • N’écrit pas directement d’instructions SQL, ce qui réduit les risques de sécurité tels que l’injection SQL
  • Étant donné que les instructions SQL sont des chaînes, même si elles commettent une erreur de syntaxe, elles ne sont pas soumises à la vérification des erreurs de construction, mais comme le modèle est une syntaxe de programme, il peut être vérifié pour les erreurs au moment de la construction.

Entity Framework Core génère automatiquement du code pour se connecter à ces modèles et bases de données à partir de bases de données existantes, À l’inverse, il existe un moyen d’écrire manuellement du code, puis de générer automatiquement une base de données.

Le premier est appelé « database-first » et le second est appelé « code-first ». Il existe également le « modèle d’abord » qui génère du code et des bases de données à partir de blueprints, tels que des diagrammes ER, mais il n’est pas largement utilisé dans Entity Framework Core.

Cette fois, nous allons utiliser un modèle « database-first » qui génère du code en supposant qu’une base de données existe déjà.

Configuration de MySQL

Dans cette astuce, assurez-vous de configurer MySQL au préalable pour accéder à votre base de données MySQL. Il peut être configuré sur un PC de votre environnement de développement ou sur un autre PC sur le réseau. Si vous pouvez vous connecter à MySQL à partir de votre environnement de développement, vous êtes prêt à partir. Dans cette astuce, nous avons installé MySQL dans un environnement différent.

Les étapes de configuration de MySQL seront omises car elles seront redondantes. Les pages suivantes contiennent des conseils liés à MySQL pour les étapes de configuration.

Création d’une table

Dans ce cas, nous allons créer le schéma (base de données) et la table suivants en tant qu’exemple.

  • Nom du schéma : test_schema
  • Nom de la table : utilisateur
  • Colonnes du tableau : [id], [nom], [mot de passe], [âge], [email], [anniversaire], [is_provisional_registration], [update_datetime]

Peu importe comment vous l’écrivez, mais si c’est fastidieux, exécutez et générez le code SQL suivant sur MySQL :

Voici la création de schéma SQL :

CREATE DATABASE `test_schema`;

La création de table est 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='テストコメント';

Ajouter un enregistrement à 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');

Définir les autorisations pour votre compte

Assurez-vous d’avoir un nom d’hôte configuré pour que le compte que vous programmez puisse accéder au schéma MySQL.

Vous devez également définir des autorisations pour test_schema accéder au compte auquel vous souhaitez vous connecter.

Cette fois, nous allons effectuer SELECT le processus de récupération des enregistrements. Je ne le ferai pas cette fois-ci, mais si vous INSERT UPDATE souhaitez insérer ou mettre à jour, veuillez vérifier et .

Installation de Visual Studio

En supposant que vous l’ayez déjà configuré également. Si vous souhaitez connaître la procédure d’installation, nous l’avons résumée sur la page suivante.

Créer un projet

Entity Framework Core ne dépend pas d’un environnement d’exécution spécifique, il peut donc être utilisé dans de nombreux projets. Dans ce cas, nous allons utiliser Entity Framework Core dans un environnement d’application console simple.

Dans le nouveau projet, sélectionnez Application console (celle qui n’est pas .NET Framework).

Vous avez créé le projet. Le nom du projet peut être n’importe quoi.

Obtenir le package Entity Framework Core pour MySQL

Obtenez un package pour utiliser Entity Framework Core avec NuGet. Le package utilise : Ce n’est pas officiel de Microsoft, mais c’est largement utilisé.

  • Pomelo.EntityFrameworkCore.MySql

Cliquez avec le bouton droit sur la dépendance et sélectionnez Gérer les packages NuGet.

Avec « Parcourir » sélectionné dans l’onglet, tapez dans le champ Pomelo de recherche . La liste des packages associés s’affiche.

Installez les paquets suivants à partir de celui-ci :

  • Pomelo.EntityFrameworkCore.MySql

Sélectionnez ce que vous souhaitez installer et cliquez sur le bouton Installer. Sélectionnez la dernière version stable de la version.

Le dialogue est fondamentalement correct et bien.

Je pense que le paquet est le suivant.

Tapez EntityFrameworkCore ensuite dans le champ de recherche et installez également ce qui suit.

  • Microsoft.EntityFrameworkCore.Tools

Pour les versions, Pomelo.EntityFrameworkCore.MySql correspondez à la version référencée Microsoft.EntityFrameworkCore par . Cette fois, nous faisons référence à la version 8.0.2, alors Microsoft.EntityFrameworkCore.Tools faisons-en également la version 8.0.2. Ce package est utilisé pour générer du code à partir de la base de données.

En fin de compte, cela devrait ressembler à ceci :

Création d’un modèle (code) à partir d’une configuration de table de base de données

Pour que votre modèle et d’autres codes soient générés automatiquement, vous devez d’abord générer votre projet pour vous assurer qu’il n’y a pas d’erreurs. S’il y a une erreur, le modèle échouera. Si vous avez déjà vérifié qu’il n’y a pas d’erreurs, vous n’avez pas besoin de générer.

Ouvrez la console du gestionnaire de package à partir de Visual Studio. Si ce n’est pas le cas, vous pouvez l’ouvrir à partir du menu Outils, Gestionnaire de package NuGet et Console du gestionnaire de package.

Vous verrez une fenêtre comme celle ci-dessous, alors assurez-vous que le « Projet par défaut » dans le coin supérieur droit est le projet pour lequel vous souhaitez créer le modèle. (Vous devez être prudent si vous avez plusieurs projets)

Entrez le texte suivant dans le champ de saisie : Les paramètres changeront en fonction de l’environnement, veuillez donc les modifier en temps opportun sur la base des explications suivantes.

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

Exemple d’entrée

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Explication du paramètre Exemple de paramètre
Fournisseur S’il s’agit de Pomelo.EntityFrameworkCore.MySql MySQL, spécifiez such like. Pomelo.EntityFrameworkCore.MySql
Connexion Il s’agit de la chaîne de connexion pour se connecter à la base de données. La chaîne de connexion peut être utilisée dans d’autres applications, veuillez donc écrire le contenu spécifié selon la notation de la chaîne de connexion. Soit dit en passant, il n’est utilisé que temporairement pour créer un modèle, il n’est donc pas nécessaire d’être conscient de la sécurité après la publication de l’application pour cette chaîne de connexion. Si vous avez un symbole dans votre mot de passe, faites attention à ne pas vous échapper. "Serveur=TestServer ; Base de données=test_schema ; user=utilisateur-test ; mot de passe=XXXXXXXX ;"
f Forcez l’écrasement même si vous avez déjà un programme. Aucun <>
Rép. de sortie Chemin d’accès au dossier pour afficher le code. Chemin d’accès relatif à partir du dossier du projet Modèles\Base de données
Contexte Noms de classe de contexte lors de l’utilisation d’Entity Framework TestDatabaseDbContext
UseDatabaseNames S’il est spécifié, le nom de la table dans la base de données sera le nom de la classe tel qu’il est. Si ce n’est pas le cas, la casse du nom de la classe d’entité est ajustée en fonction des règles. Aucun <>
DataAnnotations S’il est spécifié, le type de colonne ajoute automatiquement l’attribut DataAnnotation à chaque propriété. C’est un peu utile si vous voulez faire automatiquement la vérification des entrées en fonction du type de base de données. Aucun <>
Namespace Espace de noms auquel appartient la classe d’entité générée. S’il n’est pas spécifié, l’espace de noms est déterminé en fonction du dossier. Espace de noms de test
ContextNamespace Espace de noms auquel appartient le contexte généré. S’il n’est pas spécifié, l’espace de noms est déterminé en fonction du dossier. Espace de noms de test
NoOnConfiguration Évitez d’incorporer des chaînes de connexion brutes dans votre code. Aucun <>
NonPluraliser Évitez le nom de propriété au pluriel de chaque nom de table dans le contexte. Aucun <>

Appuyez sur Entrée pour l’exécuter et générer automatiquement le code : S’il s’agit d’une erreur, la raison s’affichera, veuillez donc répondre en fonction du contenu de l’erreur.

user Le code de modèle de la table se présente comme suit :

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

D’ailleurs, l’avertissement s’affiche car la chaîne de connexion est écrite telle quelle dans le code de la classe de contexte générée. Si possible, la chaîne de connexion doit être stockée dans un endroit séparé et définie au moment de l’exécution, mais cette fois, c’est dans le but de vérifier l’opération, donc je vais la laisser telle quelle.

Obtenir un enregistrement et le consulter

Maintenant que vous avez le code pour accéder aux enregistrements dans la base de données, essayons d’obtenir les enregistrements et de les afficher dans la console.

Program.cs et modifiez-le comme suit.

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

Générez la DbContext classe new générée automatiquement avec . Il est déclaré en pour permettre using var la destruction automatique de la connexion à la base de données.

dbContext a généré des propriétés pour accéder à chaque modèle, donc cette fois-ci user , vous pouvez manipuler les enregistrements de la table en accédant User aux propriétés. Vous n’avez pas besoin de connaître le code SQL émis, car il est généré automatiquement en interne.

ToList Ici, nous utilisons user une méthode d’extension pour obtenir tous les enregistrements de la table.

foreach Après cela, j’utilise user les méthodes et JsonSerializer.Serialize pour afficher les informations dans la console. Comme user mentionné ci-dessus, chaque colonne de la table est déclarée en tant que propriété, il est donc également possible de récupérer la valeur individuellement.