Préparer l’accès à SQL Server à l’aide d’Entity Framework Core (base de données d’abord)

Page mise à jour :
Date de création de la page :

Environnement d’exploitation

Studio visuel
  • Visual Studio 2022
.FILET
  • .NET 8
Noyau d’Entity Framework
  • Entity Framework Core 8.0
Serveur SQL
  • SQL Server 2022

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

Au début

Entity Framework Core est une bibliothèque de mappeurs O/R. Lors de l’accès à la base de données, vous pouvez accéder aux enregistrements de la base de données via des modèles (classes) définis dans le code, sans utiliser directement d’instructions SQL. Cela offre les avantages suivants :

  • Étant donné que les instructions SQL ne sont pas écrites directement, les risques de sécurité tels que l’injection SQL sont réduits.
  • Étant donné que les instructions SQL sont des chaînes, même si vous faites une erreur dans la syntaxe, elle n’est pas vérifiée pour les erreurs de génération, mais comme le modèle est une syntaxe de programme, vous pouvez vérifier les erreurs au moment de la construction.

Entity Framework Core peut générer automatiquement du code à partir de bases de données existantes pour se connecter à ces modèles et bases de données. À l’inverse, il existe un moyen d’écrire le code manuellement, puis de générer automatiquement la 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.

Dans ce cas, nous utiliserons un modèle « database-first » qui génère du code en supposant que la base de données existe déjà.

Configuration de SQL Server

Pour accéder à la base de données SQL Server dans cette astuce, veuillez configurer SQL Server à l’avance. Il peut être configuré sur un PC dans l’environnement de développement ou sur un autre PC via le réseau. Si vous pouvez vous connecter à SQL Server à partir de votre environnement de développement, vous êtes prêt à partir. Dans cette astuce, SQL Server est installé dans un environnement distinct.

Les étapes d’installation de SQL Server sont omises, car elles sont redondantes. Les pages suivantes contiennent des conseils liés à SQL Server, donc si vous voulez savoir comment le configurer, veuillez vous y référer.

Créer une table

Cette fois-ci, nous allons créer la base de données et la table suivantes en tant que M./Mme.

  • Nom de la base de données : TestDatabase
  • Nom de la table : Utilisateur
  • Colonnes du tableau : [ID], [Nom], [Mot de passe], [Âge], [E-mail], [Anniversaire], [UpdateDateTime]

Vous pouvez le créer de n’importe quelle manière, mais si vous ne le souhaitez pas, exécutez le code SQL suivant sur SQL Server pour le générer.

Ce qui suit est la création de base de données SQL, mais comme le chemin de création de la base de données change en fonction de la version, etc., il peut être plus fiable de la créer avec une interface graphique ou une commande au lieu de SQL.

USE [master]
GO
CREATE DATABASE [TestDatabase]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
 WITH CATALOG_COLLATION = DATABASE_DEFAULT, LEDGER = OFF
GO
ALTER DATABASE [TestDatabase] SET COMPATIBILITY_LEVEL = 160
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TestDatabase].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [TestDatabase] SET ARITHABORT OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [TestDatabase] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [TestDatabase] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [TestDatabase] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [TestDatabase] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [TestDatabase] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [TestDatabase] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [TestDatabase] SET  DISABLE_BROKER 
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [TestDatabase] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [TestDatabase] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [TestDatabase] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [TestDatabase] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [TestDatabase] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [TestDatabase] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [TestDatabase] SET RECOVERY FULL 
GO
ALTER DATABASE [TestDatabase] SET  MULTI_USER 
GO
ALTER DATABASE [TestDatabase] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [TestDatabase] SET DB_CHAINING OFF 
GO
ALTER DATABASE [TestDatabase] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [TestDatabase] SET TARGET_RECOVERY_TIME = 60 SECONDS 
GO
ALTER DATABASE [TestDatabase] SET DELAYED_DURABILITY = DISABLED 
GO
ALTER DATABASE [TestDatabase] SET ACCELERATED_DATABASE_RECOVERY = OFF  
GO
EXEC sys.sp_db_vardecimal_storage_format N'TestDatabase', N'ON'
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE = ON
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_STORAGE_SIZE_MB = 1000, QUERY_CAPTURE_MODE = AUTO, SIZE_BASED_CLEANUP_MODE = AUTO, MAX_PLANS_PER_QUERY = 200, WAIT_STATS_CAPTURE_MODE = ON)
GO
ALTER DATABASE [TestDatabase] SET  READ_WRITE 
GO

Création de table SQL.

USE [TestDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[User](
  [ID] [int] NOT NULL,
  [Name] [nvarchar](20) NOT NULL,
  [Password] [nvarchar](20) NOT NULL,
  [Age] [int] NULL,
  [Email] [nvarchar](200) NULL,
  [Birthday] [date] NULL,
  [UpdateDateTime] [datetime2](7) NULL,
  CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
  [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

Enregistrement Ajouter SQL.

USE [TestDatabase]
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (1, N'氏名1', N'aaaa', 20, N'aaaa@example.com', CAST(N'2020-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (2, N'氏名2', N'bbbb', 30, N'bbbb@example.com', CAST(N'2010-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO

Installation de Visual Studio

Nous supposons que vous l’avez déjà configuré également. Si vous souhaitez connaître la procédure d’installation, etc., elle est résumée sur la page suivante.

Créer un projet

Entity Framework Core ne dépend d’aucun environnement d’exécution particulier, il peut donc être utilisé dans de nombreux projets. Dans cet article, nous allons utiliser Entity Framework Core dans un environnement d’application console simple.

Dans le nouveau projet, sélectionnez Application console.

Le projet a été créé. Peu importe le nom du projet.

Obtenir le package Entity Framework Core

Obtenez un package pour utiliser Entity Framework Core avec NuGet.

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

Avec « Parcourir » sélectionné dans l’onglet, entrez dans le champ de EntityFrameworkCore recherche. Vous devez alors voir les packages liés à Entity Framework Core dans la liste.

Comme nous utiliserons SQL Server cette fois-ci, nous allons installer les packages suivants.

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer

Microsoft.EntityFrameworkCore Dans cet exemple, nous installons . Installez également les deux autres.

Sélectionnez la cible d’installation et cliquez sur le bouton Installer. Pour la version, sélectionnez la dernière version stable.

La boîte de dialogue est fondamentalement OK et vous pouvez cliquer sur OK.

Installez également les deux autres.

Je pense que le paquet ressemble à ceci :

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

Pour que le modèle et les autres codes soient générés automatiquement, générez d’abord le projet pour vous assurer qu’il n’y a pas d’erreurs. En cas d’erreur, la création du modèle échoue. Si vous avez déjà vérifié qu’il n’y a pas d’erreurs, vous n’avez pas besoin de le créer.

À partir de Visual Studio, ouvrez la console du gestionnaire de package. Si vous n’en avez pas, vous pouvez l’ouvrir à partir du menu « Outils », « Gestionnaire de package NuGet », « Console du gestionnaire de package ».

La fenêtre suivante s’affichera, alors assurez-vous que le « Projet par défaut » dans le coin supérieur droit est le projet pour lequel vous souhaitez créer un modèle. (Vous devez être prudent si vous avez plusieurs projets)

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

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Exemple d’entrée

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=TestServer;Database=TestDatabase;user id=TestUser;password=pass;TrustServerCertificate=true" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Description des paramètresExemple de paramètre
Fournisseur Pour SQL Server, il Microsoft.EntityFrameworkCore.SqlServer est fixe. Microsoft.EntityFrameworkCore.SqlServer
Connexion Chaîne de connexion pour se connecter à la base de données. Les chaînes de connexion peuvent être utilisées en commun avec d’autres applications, veuillez donc suivre la notation des chaînes de connexion pour le contenu à spécifier. Vous pouvez utiliser l’authentification Windows ou l’authentification SQL Server. D’ailleurs, 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 avoir publié l’application pour cette chaîne de connexion. Si vous avez des symboles dans votre mot de passe, faites attention à ne pas vous échapper. "Source de données=NomduServeur\SQLEXPRESS ; Base de données =Base de données de test ; user id=Nom d’utilisateur ; mot de passe=**********"
f Même si le programme existe déjà, il sera écrasé de force. Pas de <>
Rép. de sortie Chemin d’accès au dossier dans lequel vous souhaitez afficher le code. Chemin d’accès par rapport au 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 de la base de données sera le nom de la classe tel qu’il est. S’il n’est pas spécifié, la casse du nom de la classe d’entité est ajustée en fonction des règles. Pas de <>
DataAnnotations Lorsqu’il est spécifié, le type de colonne ajoute automatiquement l’attribut DataAnnotation à chaque propriété. C’est un peu utile si vous voulez effectuer automatiquement des vérifications d’entrée en fonction du type de base de données. Pas de <>
Espace de noms 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 N’intégrez pas de chaînes de connexion brutes dans votre code. Pas de <>
NonPluraliser Assurez-vous que les noms de propriété de chaque nom de table dans le contexte ne sont pas mis au pluriel. Pas de <>

Lorsque vous appuyez sur Entrée pour l’exécuter, le code est automatiquement généré : Si une erreur se produit, la raison s’affichera, veuillez donc répondre en fonction du contenu de l’erreur.

User Le code de modèle de la table est le suivant.

using System.ComponentModel.DataAnnotations;

namespace SetupSqlServerDatabaseFirst.Models.Database;

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; } = null!;

  public int? Age { get; set; }

  [StringLength(200)]
  public string? Email { get; set; }

  public DateOnly? Birthday { get; set; }

  public DateTime? UpdateDateTime { 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 dans ce cas, c’est dans le but de vérifier l’opération, je vais donc la laisser telle quelle.

Essayez de récupérer et d’afficher des enregistrements

Maintenant que nous avons le code pour accéder aux enregistrements dans la base de données, essayons de récupérer les enregistrements et de les afficher sur la console.

Program.cs et modifiez-le comme suit.

// See https://aka.ms/new-console-template for more information
using SetupSqlServerDatabaseFirst.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ère la classe new générée DbContext automatiquement dans . Il est déclaré dans afin que les connexions à la base de données puissent using var être automatiquement détruites.

dbContext génère des propriétés pour accéder à chaque modèle, donc dans ce cas User , vous pouvez manipuler les enregistrements de la table en User accédant aux propriétés. Le code SQL émis est généré automatiquement en interne et n’a pas besoin d’être remarqué.

ToList Ici, une méthode d’extension est utilisée pour User récupérer tous les enregistrements de la table.

foreach Le reste se fait à l’aide des méthodes et JsonSerializer.Serialize pour User afficher les informations sur la console. Comme User mentionné ci-dessus, chaque colonne de la table est déclarée en tant que propriété, il est donc possible de récupérer la valeur individuellement.