ASP.NET databaser ved hjælp af Entity Framework Core i Core

Dato for oprettelse af side :

Miljø

Visual Studio
  • Visual Studio 2019
ASP.NET Kerne
  • 3.1 (MVC, Razor side)
SQL Server
  • Ekspres 2019

I første omgang

Dette tip ASP.NET trin til at bruge Entity Framework Core ved hjælp af følgende kernetilgang.

Oprettelse af en database ved hjælp af Entity Framework Core osv. De ASP.NET brugt på samme måde uden for Core.

Denne gang installeres SQL Server på en anden server og forbindes med SQL Server-godkendelse. Den eneste forskel fra Windows-godkendelse, der bruges under en lokal installation, er forbindelsesstrengen, og der er ingen forskel i programmet.

Oprette en databasetabel

Dette tip bruger SQL Server. Installer SQL Server i det lokale miljø eller på en hvilken som helst server.

Hvis du ikke har en database til test, skal du oprette en database.

Hvis du opretter i SQL, f.eks.

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

Opret en tabel til test. Angiv den primære nøgle for opdateringer og sletninger.

Hvis du vil oprette det i 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

Tilføj en post til visning.

Hvis du vil tilføje det i 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 enhedsramme, der er tilgængelig i Core

Denne genstand er fælles for både MVC- og Razor-sider.

Pakkeinstallation af Entity Framework Core

Når du har oprettet dit projekt, kan du hente pakken fra NuGet, så du kan bruge Entity Framework Core først. MVC er et eksempel, men operationen er den samme på barberblade sider.

Højreklik på Afhængigheder fra projektet, og vælg Administrer NuGet-pakker.

Mens Gennemse er valgt under fanen, skal du skrive EntityFrameworkCore i søgefeltet. Kernerelaterede pakker til Entity Framework vises på listen.

Fra dette tidspunkt vil jeg bruge SQL Server, så jeg vil installere følgende pakker.

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

Lad os installere Microsoft.EntityFrameworkCore som et eksempel, så installer også de to andre.

Vælg, hvad du vil installere, og klik derefter på installationsknappen. Versionen vælger den nyeste stabilisator.

Dialogen er dybest set ok at klikke ok.

Installer de to andre så godt.

Jeg mener, at pakken er som følger.

Oprette en model (program) ud fra en databasetabelkonfiguration

Hvis du vil hente eller opdatere data fra en database i Entity Framework Core, Du skal normalt oprette et program, der er en model baseret på tabelkonfigurationen. Denne model kaldes også et aliasobjekt.

Når du opretter en model, kode først, en teknik til at oprette tabeller i en database fra en model (program), eller Der er database først, som er en teknik til at skabe modeller (programmer) fra tabeller. Her er en enkel database-første måde at automatisk programmere fra en tabel.

Forresten er disse trin ASP.NET til The Core, så du kan oprette dem i konsollen eller desktop-appen på samme måde.

Først skal du bygge projektet én gang for at sikre, at der ikke er nogen fejl. Hvis der er en fejl, kan modellen ikke oprettes. Du behøver ikke at bygge det, hvis du allerede har bekræftet, at der ikke er nogen fejl.

Åbn pakkestyringskonsollen fra Visual Studio. Ellers kan du åbne den fra værktøjerne NuGet Package Manager og Package Manager-konsoller i menuen.

Du kan se et vindue, der ligner det nedenfor, så sørg for, at standardprojektet øverst til højre er det projekt, du vil modellere. (Du skal være forsigtig, hvis du har flere projekter)

Skriv følgende tekst i inputfeltet: Parametrene varierer afhængigt af miljøet, så skift dem rettidigt til følgende beskrivelse. (især hvor det er ***** i særdeleshed)

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

En bindestreg, -Provider f.eks.

Eksempel på parameterbeskrivelsesparameter
Udbyder Rettet i Microsoft.EntityFrameworkCore.SqlServer SQL Server. Microsoft.EntityFrameworkCore.SqlServer
Forbindelse Forbindelsesstreng til oprettelse af forbindelse til databasen. Forbindelsesstrenge kan bruges i andre apps til fælles, så skriv venligst, hvad du angiver i henhold til forbindelsesstrengen kineki. Både Windows-godkendelse og SQL Server-godkendelse er tilgængelige. Forresten bruges den kun midlertidigt til at oprette en model, så du behøver ikke at være opmærksom på sikkerheden, når appen er udgivet for denne forbindelsesstreng. Pas på at undslippe, hvis du har et symbol i din adgangskode. "Datakilde=Servernavn\SQLEXPRESS;Database=TestDatabase;bruger-id=Brugernavn;adgangskode=***********
F Force overskrivning, selv om der allerede er et program. <Nej >
Outputdir Den mappesti, som koden er outputtet til. Relativ sti fra projektmappe Modeller\Database
Forbindelse Kontekstklassenavn ved brug af Entity Framework TestDatabaseDbContext
UseDatabaseNames Hvis det er angivet, bliver databasens tabelnavn klassenavnet, som det er. Ellers justeres sagen og den flerstrengede form af enhedsklassenavnet i overensstemmelse med reglerne. <Nej >
DataAnnotationer Hvis det er angivet, føjer kolonnetypen automatisk attributten DataAnnotation til hver egenskab. Dette er en smule nyttigt, hvis du automatisk vil kontrollere inputtet i henhold til databasens type. <Nej >

Hvis du trykker på Enter for at køre den, genereres der automatisk kode på følgende måde:

Modelkoden for tabellen Bruger er som følger:

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

Forresten vises advarslen, fordi forbindelsesstrengen er angivet som den er i koden for den genererede kontekstklasse. Sørg for at slette OnConfiguring metoderne i denne kontekstklasse, når koden er genereret.

Registrer forbindelsesstrenge

Dette ASP.NET kernespecifik behandling. Hvis du tilpasser den, kan du bruge den i andre .NET Core-apps, men ASP.NET du kan håndtere den som standard for Core).

Den forbindelsesstreng, der er angivet i Package Manager-konsollen, blev kun brugt til at oprette modellen.

Forbindelsesstrengen til oprettelse af forbindelse til databasen som en webapp er angivet i appsettings.json. Hvis du vil ændre databasedestinationen, som der skal oprettes forbindelse til for hvert build eller hver publikation, kan du bruge appsæt. Det kan også forgrenet af Development.json, osv.

Da forbindelsesstrengen her bruges som handling, lad os desuden træffe foranstaltninger såsom at gøre forbindelsesbrugeren til en dedikeret bruger af hensyn til sikkerhed osv.

Hvis du indstiller den til appsettings.json, skal du oprette en ConnectionStrings-sektion i rodsektionen (et objekt, ikke ligefrem en sektion). Opret et sæt nøgler og værdier i den. Navnet på nøglen kan være hvad som helst, men det vil blive brugt senere. Værdien angiver en forbindelsesstreng.

{
  // 

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

Gøre Entity Framework Core tilgængelig for programmer

Dette ASP.NET kernespecifik behandling. Hvis du tilpasser den, kan du bruge den i andre .NET Core-apps, men ASP.NET du kan håndtere den som standard for Core).

ASP.NET Core har hver instans en overlevelsestid, som er forskellig fra konsoller og skrivebordsapps. "Fra det tidspunkt, hvor webtjenesten startes, til den stoppes" eller "fra det tidspunkt, hvor anmodningen modtages, til svaret returneres". ASP.NET framework Core, som kan placeres i The Core, ServiceLifetime.Scoped angiver som standard. Hvis der ikke er nogen særlig grund, kan du blive på denne måde.

Hvis du vil give programmet adgang til databasekonteksten, skal du føje Startup.ConfigureServices den til :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Metodens typeargument angiver den kontekstklasse, du har oprettet.

options.UseSqlServer Metoden angiver, at SQL Server bruges.

Configuration.GetConnectionString("TestDatabaseDbContext") angiver det nøglenavn, der er registreret med appsettings.json.

ASP.NET use case i Core MVC

ASP.NET er flere måder at bruge Entity Framework Core i Core MVC på.

Føje di (indsætning af afhængighed) til en controller

Ved at registrere .cs services.AddDbContext metode i opstart.cs TestDatabaseDbContext Det kan indsættes i controlleren.

Et eksempel på DI HomeController er, at konstruktøren har et ILogger<HomeController> logger argument. Dette tilføjes af DI. Du kan indsætte TestDatabaseDbContext på samme måde.

Hvis du HomeController vil føje til en eksisterende , ser det sådan ud: Selvfølgelig kan det føjes til andre controllere.

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;  // 追加
  }
  
  // 省略
}

Du kan derefter få adgang til databasen ved hjælp af forekomsten af den modtagne kontekst i hver handling.

Brug sager

Følgende kode er den kode, der håndterer brugerliste og nye registreringer. Fra nu af ASP.NET kerne, vil Entity Framework Core være kode for hver, så jeg vil ikke forklare i detaljer.

Den kernegenererede model for objektet Framework kan stadig bruges som model for aktioner. Du kan også oprette en separat model og ombryde og bruge Entity Framework Core-modellen.

Konteksten kasseres også automatisk, når brugerens anmodning er overstået.

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

  // ここまで追加

  // 省略
}

Da det er besværligt at oprette skærmen manuelt, genereres listeskærmen automatisk af stilladser.

Den Views/Home/List.cshtml automatisk genererede er som følger:

@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 Føj et link til skærmovergangen til listen.

<!-- 省略 -->

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

Brugerregistreringsskærmen genereres også automatisk.

Den Views/Home/Create.cshtml automatisk genererede er som følger: Det er svært at bruge som det er, så jeg har rettet det lidt.

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

Kør og bekræft. Af den måde, er der ingen sikkerhedsforanstaltninger såsom password registrering, så følg ASP.NET Core og database registrering metoder, når du opererer.

Selvfølgelig afspejles det i databasen.

I dette tip oprettes der ikke redigeringer eller sletninger, så du kan bruge rediger til højre | Detaljer | Delete" forårsager også en fejl. Du kan oprette det på samme måde som Opret, så prøv det. De tre ovennævnte processer er også blevet føjet til eksempelkoden.

Hent databasekontekst fra RequestServices

Tilføjelse di til en controller konstruktør kan være en smule besværligt, fordi du er nødt til at tilføje det til alle de controllere, du har brug for. Alternativt RequestServices kan du få fra .

Det er ikke inkluderet i eksempelkoden, men det kan fås som følger.

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

Oprette en databasekontekst direkte

Det bruges også i konsoller og desktop apps. Du kan bruge denne metode uden problemer. Det anbefales ikke, fordi omfanget af transaktioner har tendens til at være tvetydigt i webprogrammer, hvor samtidig adgang sandsynligvis vil forekomme. Opdateringer kan muligvis ikke tilbageføres til et anmodningsbasis.

Hvis du får adgang til databasen på denne måde, DbContext skal du bruge en teknik til at udlede .

Først skal Startup du ændre til at arbejde med 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 Opret en TestDatabaseDbContextEx klasse, der er afledt af, og angiv forbindelsesstrengen appsettings.json. Hvis du kan angive en forbindelsesstreng, kan du tage en anden metode, f.eks.

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

Hvis du vil have adgang til databasen, skal du generere og bruge forekomster af de afledte klasser.

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

ASP.NET eksempel på en Core Razor-side

ASP.NET flere måder at bruge Entity Framework Core på en Core Razor-side.

Føje di (indsætning af afhængighed) til sidemodellen

Ved at registrere .cs services.AddDbContext metode i opstart.cs TestDatabaseDbContext Det kan indsættes i en sidemodel.

Et eksempel på DI IndexModel er, at konstruktøren har et ILogger<IndexModel> logger argument. Dette tilføjes af DI. Du kan indsætte TestDatabaseDbContext på samme måde.

Hvis du IndexModel vil føje til en eksisterende , ser det sådan ud: Selvfølgelig kan det føjes til andre sidemodeller.

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;  // 追加
  }
  
  // 省略
}

Du kan derefter få adgang til databasen ved hjælp af forekomsten af den kontekst, du har modtaget i hver proces.

Brug sager

Følgende kode er den kode, der håndterer brugerliste og nye registreringer. Både ASP.NET Core og Entity Framework Core vil være kode, så jeg vil ikke gå i detaljer. Konteksten kasseres også automatisk, når brugerens anmodning er overstået.

Opret en sidemodel til listeskærmen.

List.cshtml.cs på følgende måde:

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 oprettes på følgende måde:

@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>

Føj den til Index.cshtml, så du kan skifte til siden Liste.

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

Opret også en brugerregistreringsskærm.

Create.cshtml.cs-kode på følgende måde:

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 på følgende måde:

@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>

Kør og bekræft. Af den måde, er der ingen sikkerhedsforanstaltninger såsom password registrering, så følg ASP.NET Core og database registrering metoder, når du opererer.

Selvfølgelig afspejles det i databasen.

Jeg har ikke oprettet nogen redigeringer eller sletninger, så jeg vil ikke redigere for at | Detaljer | Delete" forårsager også en fejl. Du kan oprette det på samme måde som Opret, så prøv det. De tre ovennævnte processer er også blevet føjet til eksempelkoden.

Hent databasekontekst fra RequestServices

Tilføjelse di til en sidemodel konstruktør er en smule besværligt, fordi du er nødt til at tilføje det til alle de sidemodeller, du har brug for. Alternativt RequestServices kan du få fra .

Det er ikke inkluderet i eksempelkoden, men det kan fås som følger.

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

Oprette en databasekontekst direkte

Det bruges også i konsoller og desktop apps. Du kan bruge denne metode uden problemer. Det anbefales ikke, fordi omfanget af transaktioner har tendens til at være tvetydigt i webprogrammer, hvor samtidig adgang sandsynligvis vil forekomme. Opdateringer kan muligvis ikke tilbageføres til et anmodningsbasis.

Hvis du får adgang til databasen på denne måde, DbContext skal du bruge en teknik til at udlede .

Først skal Startup du ændre til at arbejde med 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 Opret en TestDatabaseDbContextEx klasse, der er afledt af, og angiv forbindelsesstrengen appsettings.json. Hvis du kan angive en forbindelsesstreng, kan du tage en anden metode, f.eks.

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

Hvis du vil have adgang til databasen, skal du generere og bruge forekomster af de afledte klasser.

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