ASP.NET bases de données en utilisant entity framework core in Core

Date de création de la page :

environnement

Studio visuel
  • Studio visuel 2019
ASP.NET noyau
  • 3.1 (MVC, Page Razor)
Serveur SQL
  • Express 2019

au début

Ces conseils ASP.NET pour utiliser le noyau-cadre de l’entité en utilisant l’approche suivante de base.

La création d’une base de données, l’utilisation du noyau de framework d’entité, et ainsi de suite ne sont pas l’objectif principal de ces conseils, de sorte que nous n’allons pas entrer dans les détails. Ils ASP.NET utilisés de la même manière en dehors de Core.

Cette fois, le serveur sql est installé sur un serveur différent et connecté par l’authentification SQL Server. La seule différence par rapport à l’authentification Windows utilisée lors d’une installation locale est la chaîne de connexion, et il n’y a aucune différence dans le programme.

Créer une table de base de données

Ce tips utilise SQL Server. Installez SQL Server dans votre environnement local ou sur n’importe quel serveur.

Si vous n’avez pas de base de données à tester, créez une base de données.

Si vous créez dans SQL, comme ce qui suit, modifiez le chemin de version SQL Server et le nom de la base de données en fonction de votre environnement.

USE [master]
GO

CREATE DATABASE [TestDatabase]
  CONTAINMENT = NONE
  ON  PRIMARY 
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
  LOG ON 
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
  WITH CATALOG_COLLATION = DATABASE_DEFAULT
GO

Créez une table pour les tests. Définissez la clé principale pour les mises à jour et les suppressions.

Si vous souhaitez le créer dans 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

Ajoutez un enregistrement pour l’affichage.

Si vous souhaitez l’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

ASP.NET cadre d’entités disponibles dans Core

Cet élément est commun aux pages MVC et Razor.

Installation d’ensemble du noyau-cadre de l’entité

Une fois que vous avez créé votre projet, obtenez le paquet de NuGet afin que vous puissiez utiliser Entity Framework Core en premier. MVC est un exemple, mais l’opération est la même sur les pages de rasoir.

Cliquez à droite Dépendances du projet et sélectionnez Gérer les paquets NuGet.

Avec Parcourir sélectionné à partir de l’onglet, tapez EntityFrameworkCore dans le champ de recherche. Les paquets liés au noyau du cadre d’entité s’apparaissent dans la liste.

À partir de ce moment, je vais utiliser SQL Server, donc je vais installer les paquets suivants.

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Outils
  • Microsoft.EntityFrameworkCore.SqlServer

Installons Microsoft.EntityFrameworkCore à titre d’exemple, alors installez les deux autres.

Sélectionnez ce que vous souhaitez installer, puis cliquez sur le bouton d’installation. La version sélectionne le dernier stabilisateur.

Le dialogue est fondamentalement ok pour cliquer sur ok.

Installez les deux autres ainsi.

Je pense que le paquet est le suivant.

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

Si vous souhaitez récupérer ou mettre à jour des données à partir d’une base de données dans Entity Framework Core, Vous devez généralement créer un programme qui est un modèle basé sur la configuration de la table. Ce modèle est également appelé une entité alias.

Lorsque vous créez un modèle, codez d’abord, une technique de création de tables dans une base de données à partir d’un modèle (programme), ou Il ya la base de données d’abord, qui est une technique pour créer des modèles (programmes) à partir de tables. Voici une simple façon de programmer automatiquement à partir d’une table.

Soit dit en passant, ces étapes sont ASP.NET the Core, de sorte que vous pouvez les créer dans la console ou l’application de bureau de la même manière.

Tout d’abord, construire le projet une fois pour s’assurer qu’il n’y a pas d’erreurs. S’il y a une erreur, le modèle ne peut pas être créé. Vous n’avez pas besoin de le construire si vous avez déjà vérifié qu’il n’y a pas d’erreurs.

Depuis Visual Studio, ouvrez la console Package Manager. Sinon, vous pouvez l’ouvrir à partir des outils, nuget package manager, et package manager consoles dans le menu.

Vous verrez une fenêtre similaire à celle ci-dessous, alors assurez-vous que le projet par défaut en haut à droite est le projet que vous souhaitez modéliser. (Vous devez être prudent si vous avez plusieurs projets)

Dans le champ d’entrée, tapez le texte suivant : Les paramètres varient en fonction de l’environnement, donc s’il vous plaît les changer en temps opportun à la description suivante. (surtout là où c’est ***** en particulier)

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=********\SQLEXPRESS;Database=TestDatabase;user id=********;password=**********" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations

Un hyphenated, -Provider comme à la tête de chaque nom, est le nom de paramètre, suivi par la valeur de ce paramètre.

Exemple de paramètre de description
fournisseur Corrigé dans Microsoft.EntityFrameworkCore.SqlServer SQL Server. 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 dans d’autres applications en commun, alors veuillez écrire ce que vous spécifiez en fonction de la chaîne de connexion kineki. L’authentification Windows et l’authentification SQL Server sont disponibles. Soit dit en passant, il n’est utilisé que temporairement pour créer un modèle, de sorte que vous n’avez pas besoin d’être conscient de la sécurité après que l’application est publiée pour cette chaîne de connexion. Méfiez-vous de vous échapper si vous avez un symbole dans votre mot de passe. « Source de données=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=**********
F Écriture de force même s’il y a déjà un programme. <Non >
SortieDir Le chemin de dossier vers lequel le code est sortie. Chemin relatif à partir du dossier du projet Modèles\Base de données
contexte Nom de classe context contexté lors de l’utilisation du cadre d’entité TestDatabaseDbContext (en)
UtiliserDatabaseNames S’il est spécifié, le nom de la table de la base de données devient le nom de classe tel qu’il est. Dans le cas contraire, le cas et la forme multiple du nom de classe de l’entité sont ajustés selon les règles. <Non >
DonnéesAnnotations S’il est spécifié, le type de colonne joint automatiquement l’attribut DataAnnotation à chaque propriété. Ceci est un peu utile si vous voulez vérifier automatiquement l’entrée en fonction du type de base de données. <Non >

En appuyant sur Enter pour l’exécuter, il générera automatiquement du code comme suit :

Le code modèle de la table utilisateur est le suivant :

[Table("User")]
public partial class User
{
  [Key]
  public int ID { get; set; }
  [Required]
  [StringLength(20)]
  public string Name { get; set; }
  [Required]
  [StringLength(20)]
  public string Password { get; set; }
  public int? Age { get; set; }
  [StringLength(200)]
  public string Email { get; set; }
  [Column(TypeName = "date")]
  public DateTime? Birthday { get; set; }
  public DateTime? UpdateDateTime { get; set; }
}

Soit dit en passant, l’avertissement est affiché parce que la chaîne de connexion est répertoriée comme il est dans le code de la classe de contexte généré. Assurez-vous de supprimer OnConfiguring les méthodes dans cette classe de contexte après la générée du code.

Enregistrer les chaînes de connexion

Il s ASP.NET d’un traitement spécifique au noyau. (Si vous le personnalisez, vous pouvez l’utiliser dans d’autres applications .NET Core, mais ASP.NET vous pouvez le gérer par défaut pour Core.)

La chaîne de connexion spécifiée dans la console Package Manager n’a été utilisée que pour générer le modèle.

La chaîne de connexion pour se connecter à la base de données en tant qu’application Web est répertoriée dans appsettings.json. Si vous souhaitez modifier la destination de base de données pour vous connecter à chaque build ou publication, vous pouvez utiliser des appsettings. Il peut également être ramé par Development.json, etc.

En outre, puisque la chaîne de connexion ici est utilisée comme fonctionnement, prenons des mesures telles que faire de l’utilisateur de connexion un utilisateur dédié en considération de la sécurité, etc.

Si vous le définissez sur appsettings.json, créez une section ConnectionStrings dans la section racine (un objet, pas exactement une section). Créez un ensemble de touches et de valeurs. Le nom de la clé peut être n’importe quoi, mais il sera utilisé plus tard. La valeur spécifie une chaîne de connexion.

{
  // 

  "ConnectionStrings": {
    "TestDatabaseDbContext": "Data Source=ServerName\\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=********"
  }
}

Mettre le noyau-cadre de l’entité à la disposition des programmes

Il s ASP.NET d’un traitement spécifique au noyau. (Si vous le personnalisez, vous pouvez l’utiliser dans d’autres applications .NET Core, mais ASP.NET vous pouvez le gérer par défaut pour Core.)

ASP.NET Core, chaque instance a un temps de survie, qui est différent des consoles et des applications de bureau. Par exemple, « À partir du moment où le service Web est démarré jusqu’à ce qu’il soit arrêté » ou « à partir du moment où la demande est reçue jusqu’à ce que la réponse soit retournée ». ASP.NET framework Core, qui peut être placé dans The Core, ServiceLifetime.Scoped spécifie par défaut. S’il n’y a pas de raison particulière, vous pouvez rester ainsi.

Pour permettre à votre programme d’accéder au contexte de la base de données, Startup.ConfigureServices ajoutez-le à :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
using DatabaseEntityFrameworkCoreMvc.Models.Database;

// 追加
using Microsoft.EntityFrameworkCore;

public class Startup
{
  // 省略

  // このメソッドはランタイムによって呼び出されます。 このメソッドを使用して、コンテナーにサービスを追加します。
  public void ConfigureServices(IServiceCollection services)
  {
    // 省略

    // 追加
    services.AddDbContext<TestDatabaseDbContext>(
      options => options.UseSqlServer(Configuration.GetConnectionString("TestDatabaseDbContext")));
  }

  // 省略

services.AddDbContext<TestDatabaseDbContext> L’argument type de la méthode spécifie la classe de contexte que vous avez créée.

options.UseSqlServer La méthode indique que le serveur sql est utilisé.

Configuration.GetConnectionString("TestDatabaseDbContext") spécifie le nom clé enregistré avec appsettings.json.

ASP.NET d’utilisation dans Core MVC

ASP.NET plusieurs façons d’utiliser le noyau-cadre de l’entité dans core MVC.

Ajouter di (insert de dépendance) à un contrôleur

En enregistrant .cs services.AddDbContext méthode de démarrage.cs TestDatabaseDbContext Il peut être inséré dans le contrôleur.

Un exemple de DI HomeController est que le constructeur a un ILogger<HomeController> logger argument. Ceci est ajouté par DI. Vous pouvez insérer TestDatabaseDbContext de la même manière.

Si vous HomeController voulez ajouter à un existant, il ressemble à ceci: Bien sûr, il peut être ajouté à d’autres contrôleurs.

using DatabaseEntityFrameworkCoreMvc.Models.Database;  // 追加

// 省略

public class HomeController : Controller
{
  private readonly ILogger<HomeController> _logger;
  
  // 追加
  private readonly TestDatabaseDbContext _dbContext;
  
  public HomeController(ILogger<HomeController> logger, TestDatabaseDbContext dbContext)  // 追加
  {
    _logger = logger;
    _dbContext = dbContext;  // 追加
  }
  
  // 省略
}

Vous pouvez ensuite accéder à la base de données en utilisant l’instance du contexte reçu dans chaque action.

Utiliser des cas

Le code suivant est le code qui gère la liste des utilisateurs et les nouvelles inscriptions. À partir de ASP.NET, le noyau de framework d’entité sera le code pour chacun, donc je ne vais pas expliquer en détail.

Le modèle généré par framework core de l’entité peut toujours être utilisé comme modèle d’actions. Vous pouvez également créer un modèle distinct et envelopper et utiliser le modèle De base de framework d’entité.

En outre, le contexte est automatiquement rejeté lorsque la demande de l’utilisateur est terminée.

HomeController.cs

public class HomeController : Controller
{
  private readonly TestDatabaseDbContext _dbContext;

  // 省略

  // ここから追加

  /// <summary>
  /// ユーザー一覧表示アクション。
  /// </summary>
  public IActionResult List()
  {
    // データベースから User 一覧を取得する
    var users = _dbContext.Users.ToList();
    
    // ビューに渡す
    return View(users);
  }
  
  /// <summary>
  /// ユーザー一新規登録画面。
  /// </summary>
  public IActionResult Create()
  {
    return View();
  }
  
  /// <summary>
  /// ユーザー新規登録処理。
  /// </summary>
  [HttpPost]
  public IActionResult Create(User user)
  {
    // エラーがある場合は登録画面に戻る
    if (ModelState.IsValid == false) View(user);
    
    // 更新日時設定
    user.UpdateDateTime = DateTime.Now;

    // 登録リストにユーザー追加
    _dbContext.Users.Add(user);

    // 登録を確定する
    _dbContext.SaveChanges();
    
    // 一覧画面に遷移
    return RedirectToAction(nameof(List));
  }

  // ここまで追加

  // 省略
}

Comme il est gênant de créer l’écran manuellement, l’écran de liste est automatiquement généré par échafaudage.

Views/Home/List.cshtmlL’auto-généré est le suivant:

@model IEnumerable<DatabaseEntityFrameworkCoreMvc.Models.Database.User>

@{
  ViewData["Title"] = "List";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>List</h1>

<p>
  <a asp-action="Create">Create New</a>
</p>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.ID)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Name)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Password)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Age)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Email)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Birthday)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.UpdateDateTime)
      </th>
      <th></th>
    </tr>
  </thead>
  <tbody>
@foreach (var item in Model) {
    <tr>
      <td>
        @Html.DisplayFor(modelItem => item.ID)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Name)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Password)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Age)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Email)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Birthday)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.UpdateDateTime)
      </td>
      <td>
        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
      </td>
    </tr>
}
  </tbody>
</table>

Index.cshtml Ajouter un lien vers la transition d’écran à la liste.

<!-- 省略 -->

<ul>
  <li><a asp-action="List">List</a></li>
</ul>

L’écran d’enregistrement de l’utilisateur est également généré automatiquement.

Views/Home/Create.cshtmlL’auto-généré est le suivant: Il est difficile à utiliser tel qu’il est, donc je l’ai réparé un peu.

@model DatabaseEntityFrameworkCoreMvc.Models.Database.User

@{
  ViewData["Title"] = "Create";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="ID" class="control-label"></label>
        <input asp-for="ID" class="form-control" />
        <span asp-validation-for="ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Password" class="control-label"></label>
        <input asp-for="Password" class="form-control" type="password" /> <!-- type="password" 追加 -->
        <span asp-validation-for="Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Age" class="control-label"></label>
        <input asp-for="Age" class="form-control" />
        <span asp-validation-for="Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Email" class="control-label"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Birthday" class="control-label"></label>
        <input asp-for="Birthday" class="form-control" type="date" /> <!-- type="date" 追加 -->
        <span asp-validation-for="Birthday" class="text-danger"></span>
      </div>
      @* 更新日時は入力しないのでコメントアウト *@
      @*
      <div class="form-group">
        <label asp-for="UpdateDateTime" class="control-label"></label>
        <input asp-for="UpdateDateTime" class="form-control "/>
        <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
      </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
    <a asp-action="List">Back to List</a>  <!-- List に遷移するように変更 -->
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

Courez et confirmez. Soit dit en passant, il n’y a pas de mesures de sécurité telles que l’enregistrement des mots de passe, donc s’il vous plaît suivre ASP.NET de base et les méthodes d’enregistrement de base de données lors de l’exploitation.

Bien sûr, cela se reflète dans la base de données.

Ce tips ne crée pas de modifications ou de suppressions, de sorte que vous pouvez utiliser modifier à la bonne | Détails | Supprimer " provoque également une erreur. Vous pouvez le créer de la même manière que Créer, alors essayez-le. Les trois processus ci-dessus ont également été ajoutés au code de l’échantillon.

Obtenez le contexte de base de données de RequestServices

L’ajout de di à un constructeur de contrôleur peut être un peu lourd parce que vous devez l’ajouter à tous les contrôleurs dont vous avez besoin. Alternativement, RequestServices vous pouvez obtenir de .

Il n’est pas inclus dans le code de l’échantillon, mais il peut être obtenu comme suit.

/// <summary>
/// ユーザー一覧表示アクション。
/// </summary>
public IActionResult List()
{
  // RequestServices からデータベースコンテキストを取得する
  var dbContext = (TestDatabaseDbContext)HttpContext.RequestServices.GetService(typeof(TestDatabaseDbContext));
  
  // データベースから User 一覧を取得する
  var users = dbContext.Users.ToList();
  
  // ビューに渡す
  return View(users);
}

Créer un contexte de base de données directement

Il est également utilisé dans les consoles et les applications de bureau. Vous pouvez utiliser cette méthode sans aucun problème. Il n’est pas recommandé parce que la portée des transactions tend à être ambiguë dans les applications Web où l’accès simultané est susceptible de se produire. En particulier, les mises à jour peuvent ne pas être en mesure d’être annulées sur une base de demande par demande.

Si vous accédez à la base de données DbContext de cette façon, vous utiliserez une technique pour dériver .

Tout Startup d’abord, modifier le de travailler avec Configuration static .

public class Startup
{
  public Startup(IConfiguration configuration)
  {
    Configuration = configuration;
    ConfigurationStatic = configuration;  // 追加
  }
  
  public IConfiguration Configuration { get; }
  public static IConfiguration ConfigurationStatic { get; private set; }  // 追加

  // 省略
}

TestDatabaseDbContext Créez une classe TestDatabaseDbContextEx dérivée et réglez la chaîne de connexion appsettings.json. Si vous pouvez définir une chaîne de connexion, vous pouvez prendre une autre méthode, comme la passer par un constructeur.

using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

namespace DatabaseEntityFrameworkCoreMvc.Models.Database
{
  public partial class TestDatabaseDbContextEx : TestDatabaseDbContext
  {
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      if (!optionsBuilder.IsConfigured)
      {
        optionsBuilder.UseSqlServer(Startup.ConfigurationStatic.GetConnectionString("TestDatabaseDbContext"));
      }
    }
  }
}

Si vous souhaitez accéder à la base de données, générer et utiliser des instances des classes dérivées.

/// <summary>
/// ユーザー一覧表示アクション。
/// </summary>
public IActionResult List()
{
  // 派生クラスのデータベースコンテキストのインスタンスを生成する
  using var dbContext = new TestDatabaseDbContextEx();
  
  // データベースから User 一覧を取得する
  var users = dbContext.Users.ToList();
  
  // ビューに渡す
  return View(users);
}

ASP.NET exemple sur une page Core Razor

ASP.NET plusieurs façons d’utiliser entity framework core sur une page Core Razor.

Ajouter di (insert dépendance) au modèle de page

En enregistrant .cs services.AddDbContext méthode de démarrage.cs TestDatabaseDbContext Il peut être inséré dans un modèle de page.

Un exemple de DI IndexModel est que le constructeur a un ILogger<IndexModel> logger argument. Ceci est ajouté par DI. Vous pouvez insérer TestDatabaseDbContext de la même manière.

Si vous IndexModel voulez ajouter à un existant, il ressemble à ceci: Bien sûr, il peut être ajouté à d’autres modèles de page.

using DatabaseEntityFrameworkCoreMvc.Models.Database;  // 追加

// 省略

public class IndexModel : PageModel
{
  private readonly ILogger<IndexModel> _logger;
  
  // 追加
  private readonly TestDatabaseDbContext _dbContext;
  
  public IndexModel(ILogger<IndexModel> logger, TestDatabaseDbContext dbContext)  // 追加
  {
    _logger = logger;
    _dbContext = dbContext;  // 追加
  }
  
  // 省略
}

Vous pouvez ensuite accéder à la base de données en utilisant l’instance du contexte que vous avez reçu dans chaque processus.

Utiliser des cas

Le code suivant est le code qui gère la liste des utilisateurs et les nouvelles inscriptions. Les ASP.NET core et entity framework core seront du code, donc je n’entrerai pas dans les détails. En outre, le contexte est automatiquement rejeté lorsque la demande de l’utilisateur est terminée.

Créez un modèle de page pour l’écran de liste.

List.cshtml.cs comme suit:

using System.Collections.Generic;
using System.Linq;
using DatabaseEntityFrameworkCoreRazor.Models.Database;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace DatabaseEntityFrameworkCoreRazor.Pages
{
  public class ListModel : PageModel
  {
    private readonly TestDatabaseDbContext _dbContext;
    
    /// <summary>
    /// 一覧に表示するためのユーザー一覧を格納します。
    /// </summary>
    public List<User> Users { get; set; }
    
    /// <summary>
    /// DI で TestDatabaseDbContext を受け取ります。
    /// </summary>
    /// <param name="dbContext"></param>
    public ListModel(TestDatabaseDbContext dbContext)
    {
      _dbContext = dbContext;
    }
    
    /// <summary>
    /// ページにアクセスされたときに呼ばれます。
    /// </summary>
    public void OnGet()
    {
      // データベースからユーザー一覧を取得します。
      Users = _dbContext.Users.ToList();
    }
  }
}

List.cshtml est créé comme suit:

@page
@model DatabaseEntityFrameworkCoreRazor.Pages.ListModel
@{
}

<h1>List</h1>

<p>
  <a asp-page="Create">Create New</a>
</p>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].ID)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Name)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Password)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Age)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Email)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Birthday)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].UpdateDateTime)
      </th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    @foreach (var item in Model.Users)
    {
      <tr>
        <td>
          @Html.DisplayFor(modelItem => item.ID)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Password)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Age)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Birthday)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.UpdateDateTime)
        </td>
        <td>
          <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
          <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
          <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
        </td>
      </tr>
    }
  </tbody>
</table>

Ajoutez-le à Index.cshtml afin que vous puissiez passer à la page Liste.

<!-- 追加 -->
<ul>
  <li><a asp-page="List">List</a></li>
</ul>

Créez également un écran d’enregistrement utilisateur.

Create.cshtml.cs code comme suit:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DatabaseEntityFrameworkCoreRazor.Models.Database;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace DatabaseEntityFrameworkCoreRazor.Pages
{
  public class CreateModel : PageModel
  {
    private readonly TestDatabaseDbContext _dbContext;

    /// <summary>
    /// 登録するユーザー情報を格納します。
    /// </summary>
    [BindProperty]
    public User UserInfo { get; set; }

    /// <summary>
    /// DI で TestDatabaseDbContext を受け取ります。
    /// </summary>
    /// <param name="dbContext"></param>
    public CreateModel(TestDatabaseDbContext dbContext)
    {
      _dbContext = dbContext;
    }

    /// <summary>
    /// ページにアクセスされたときに呼ばれます。
    /// </summary>
    public void OnGet()
    {
      // 画面表示時は何もしません。
    }

    /// <summary>
    /// POST が送信されたときに呼ばれる。
    /// </summary>
    public IActionResult OnPost()
    {
      // エラーがある場合は登録画面に戻る
      if (ModelState.IsValid == false) return Page();

      // 更新日時設定
      UserInfo.UpdateDateTime = DateTime.Now;

      // 登録リストにユーザー追加
      _dbContext.Users.Add(UserInfo);

      // 登録を確定する
      _dbContext.SaveChanges();

      // 一覧画面に遷移
      return RedirectToPage("List");
    }
  }
}

Create.cshtml comme suit:

@page
@model DatabaseEntityFrameworkCoreRazor.Pages.CreateModel
@{
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="UserInfo.ID" class="control-label"></label>
        <input asp-for="UserInfo.ID" class="form-control" />
        <span asp-validation-for="UserInfo.ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Name" class="control-label"></label>
        <input asp-for="UserInfo.Name" class="form-control" />
        <span asp-validation-for="UserInfo.Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Password" class="control-label"></label>
        <input asp-for="UserInfo.Password" class="form-control" type="password" />
        <span asp-validation-for="UserInfo.Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Age" class="control-label"></label>
        <input asp-for="UserInfo.Age" class="form-control" />
        <span asp-validation-for="UserInfo.Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Email" class="control-label"></label>
        <input asp-for="UserInfo.Email" class="form-control" />
        <span asp-validation-for="UserInfo.Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Birthday" class="control-label"></label>
        <input asp-for="UserInfo.Birthday" class="form-control" type="date" />
        <span asp-validation-for="UserInfo.Birthday" class="text-danger"></span>
      </div>
      @*
        <div class="form-group">
          <label asp-for="UpdateDateTime" class="control-label"></label>
          <input asp-for="UpdateDateTime" class="form-control" />
          <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
        </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
  <a asp-page="List">Back to List</a>
</div>

Courez et confirmez. Soit dit en passant, il n’y a pas de mesures de sécurité telles que l’enregistrement des mots de passe, donc s’il vous plaît suivre ASP.NET de base et les méthodes d’enregistrement de base de données lors de l’exploitation.

Bien sûr, cela se reflète dans la base de données.

Je n’ai pas créé de modifications ou de suppressions, donc je ne veux pas modifier pour | Détails | Supprimer " provoque également une erreur. Vous pouvez le créer de la même manière que Créer, alors essayez-le. Les trois processus ci-dessus ont également été ajoutés au code de l’échantillon.

Obtenez le contexte de base de données de RequestServices

Ajouter di à un constructeur de modèle de page est un peu lourd parce que vous devez l’ajouter à tous les modèles de page dont vous avez besoin. Alternativement, RequestServices vous pouvez obtenir de .

Il n’est pas inclus dans le code de l’échantillon, mais il peut être obtenu comme suit.

/// <summary>
/// ページにアクセスされたときに呼ばれます。
/// </summary>
public void OnGet()
{
  // RequestServices からデータベースコンテキストを取得する
  var dbContext = (TestDatabaseDbContext)HttpContext.RequestServices.GetService(typeof(TestDatabaseDbContext));
  
  // データベースからユーザー一覧を取得します。
  Users = dbContext.Users.ToList();
}

Créer un contexte de base de données directement

Il est également utilisé dans les consoles et les applications de bureau. Vous pouvez utiliser cette méthode sans aucun problème. Il n’est pas recommandé parce que la portée des transactions tend à être ambiguë dans les applications Web où l’accès simultané est susceptible de se produire. En particulier, les mises à jour peuvent ne pas être en mesure d’être annulées sur une base de demande par demande.

Si vous accédez à la base de données DbContext de cette façon, vous utiliserez une technique pour dériver .

Tout Startup d’abord, modifier le de travailler avec Configuration static .

public class Startup
{
  public Startup(IConfiguration configuration)
  {
    Configuration = configuration;
    ConfigurationStatic = configuration;  // 追加
  }
  
  public IConfiguration Configuration { get; }
  public static IConfiguration ConfigurationStatic { get; private set; }  // 追加

  // 省略
}

TestDatabaseDbContext Créez une classe TestDatabaseDbContextEx dérivée et réglez la chaîne de connexion appsettings.json. Si vous pouvez définir une chaîne de connexion, vous pouvez prendre une autre méthode, comme la passer par un constructeur.

using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

namespace DatabaseEntityFrameworkCoreRazor.Models.Database
{
  public partial class TestDatabaseDbContextEx : TestDatabaseDbContext
  {
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      if (!optionsBuilder.IsConfigured)
      {
        optionsBuilder.UseSqlServer(Startup.ConfigurationStatic.GetConnectionString("TestDatabaseDbContext"));
      }
    }
  }
}

Si vous souhaitez accéder à la base de données, générer et utiliser des instances des classes dérivées.

/// <summary>
/// ページにアクセスされたときに呼ばれます。
/// </summary>
public void OnGet()
{
  // 派生クラスのデータベースコンテキストのインスタンスを生成する
  using var dbContext = new TestDatabaseDbContextEx();
    
  // データベースからユーザー一覧を取得します。
  Users = dbContext.Users.ToList();
}