ASP.NET databaser med hjälp av Entity Framework Core i Core

Datum för skapande av sida :

Miljö

Visuell studio
  • Visual Studio 2019
ASP.NET kärna
  • 3.1 (MVC, Rakhyvelsida)
SQL-server
  • 2019 Express

Till en början

Det här tipset ASP.NET steg för att använda Entity Framework Core med hjälp av följande kärnmetod.

Att skapa en databas med hjälp av Entity Framework Core och så vidare är inte huvudfokus för dessa tips, så vi kommer inte att gå in på detaljer. De ASP.NET användas på samma sätt utanför Core.

Den här gången installeras SQL Server på en annan server och ansluts med SQL Server-autentisering. Den enda skillnaden från Windows-autentisering som används under en lokal installation är anslutningssträngen och det finns ingen skillnad i programmet.

Skapa en databastabell

I det här tipset används SQL Server. Installera SQL Server i din lokala miljö eller på vilken server som helst.

Om du inte har någon databas för testning skapar du en databas.

Om du skapar i SQL, till exempel följande, ändrar du SQL Server-versionssökvägen och databasnamnet så att det passar din miljö.

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

Skapa en tabell för testning. Ange primärnyckeln för uppdateringar och borttagningar.

Om du vill skapa 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

Lägg till en post för visning.

Om du vill lägga till 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 etttitetsramverk som är tillgängligt i Core

Det här objektet är vanligt på både MVC- och Razor-sidor.

Paketinstallation av Entity Framework Core

När du har skapat ditt projekt hämtar du paketet från NuGet så att du kan använda Entity Framework Core först. MVC är ett exempel, men åtgärden är densamma på rakbladssidor.

Högerklicka på Beroenden från projektet och välj Hantera NuGet-paket.

När Bläddra har valts på fliken skriver du EntityFrameworkCore i sökfältet. Entitetsramverkets kärnrelaterade paket visas i listan.

Från och med den här tiden kommer jag att använda SQL Server, så jag installerar följande paket.

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Verktyg
  • Microsoft.EntityFrameworkCore.SqlServer

Låt oss installera Microsoft.EntityFrameworkCore som ett exempel, så installera de andra två också.

Välj vad du vill installera och klicka sedan på installationsknappen. Versionen väljer den senaste stabilisatorn.

Dialogrutan är i princip ok att klicka på ok.

Installera de andra två också.

Jag anser att paketet är följande.

Skapa en modell (program) från en databastabellkonfiguration

Om du vill hämta eller uppdatera data från en databas i Entity Framework Core Du måste vanligtvis skapa ett program som är en modell baserat på tabellkonfigurationen. Den här modellen kallas också en aliasentitet.

När du skapar en modell, kod först, en teknik för att skapa tabeller i en databas från en modell (program) eller Det finns databas först, vilket är en teknik för att skapa modeller (program) från tabeller. Här är ett enkelt databas-första sätt att automatiskt programmera från en tabell.

Förresten är dessa steg ASP.NET kärnan, så att du kan skapa dem i konsol- eller skrivbordsappen på samma sätt.

Bygg först projektet en gång för att se till att det inte finns några fel. Om det finns ett fel kan modellen inte skapas. Du behöver inte bygga den om du redan har verifierat att det inte finns några fel.

Öppna Package Manager-konsolen i Visual Studio. Annars kan du öppna den från verktygen NuGet Package Manager och Package Manager-konsolerna på menyn.

Du ser ett fönster som liknar det nedan, så se till att standardprojektet längst upp till höger är det projekt du vill modellera. (Du måste vara försiktig om du har flera projekt)

Skriv följande text i inmatningsfältet: Parametrarna varierar beroende på miljö, så ändra dem i rätt tid till följande beskrivning. (särskilt där det är ***** i synnerhet)

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

En avstavad, -Provider till exempel i huvudet på varje namn, är parameternamnet, följt av värdet för den parametern.

Parameterexempel för parameterbeskrivning
Leverantör Fast i Microsoft.EntityFrameworkCore.SqlServer SQL Server. Microsoft.EntityFrameworkCore.SqlServer
Anslutning Anslutningssträng för anslutning till databasen. Anslutningssträngar kan användas i andra appar gemensamt, så skriv vad du anger enligt anslutningssträngen kineki. Både Windows-autentisering och SQL Server-autentisering är tillgängliga. Förresten används den bara tillfälligt för att skapa en modell, så du behöver inte vara medveten om säkerheten när appen har publicerats för den här anslutningssträngen. Se upp för att fly om du har en symbol i ditt lösenord. "Data Source=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=*********"
F Tvinga överskrivning även om det redan finns ett program. <Nej >
UtdataDir Mappsökvägen som koden matas ut till. Relativ sökväg från projektmapp Modeller\Databas
Sammanhang Kontextklassnamn när du använder Entitetsramverket TestaDatabaseDbContext
AnvändaDatabasnamn Om det anges blir databasens tabellnamn klassnamnet som det är. I annat fall justeras fallet och den flera formen av enhetsklassnamnet enligt reglerna. <Nej >
DataAnnotationer Om det anges lägger kolumntypen automatiskt till attributet DataAnnotation i varje egenskap. Detta är lite användbart om du automatiskt vill kontrollera indata enligt databasens typ. <Nej >

Om du trycker på Retur för att köra genereras koden automatiskt enligt följande:

Modellkoden för tabellen Användare är följande:

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

Förresten visas varningen eftersom anslutningssträngen visas som den är i koden för den genererade kontextklassen. Se till att ta OnConfiguring bort metoderna i den här kontextklassen när koden har genererats.

Registrera anslutningssträngar

Detta ASP.NET en kärnspecifik bearbetning. (Om du anpassar den kan du använda den i andra .NET Core-appar, men ASP.NET kan hantera den som standard för Core.)

Anslutningssträngen som angavs i Package Manager-konsolen användes bara för att generera modellen.

Anslutningssträngen för anslutning till databasen som webbapp visas i appsettings.json. Om du vill ändra databasmålet som du vill ansluta till för varje version eller publikation kan du använda appsettings. Det kan också förgrenas av Development.json, etc.

Dessutom, eftersom anslutningssträngen här används som åtgärd, låt oss vidta åtgärder som att göra anslutningsanvändaren till en dedikerad användare med hänsyn till säkerhet etc.

Om du ställer in det på appsettings.json skapar du avsnittet ConnectionStrings i rotavsnittet (ett objekt, inte exakt ett avsnitt). Skapa en uppsättning nycklar och värden i den. Namnet på nyckeln kan vara vad som helst, men den kommer att användas senare. Värdet anger en anslutningssträng.

{
  // 

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

Göra Entity Framework Core tillgängligt för program

Detta ASP.NET en kärnspecifik bearbetning. (Om du anpassar den kan du använda den i andra .NET Core-appar, men ASP.NET kan hantera den som standard för Core.)

ASP.NET Core har varje instans en överlevnadstid, som skiljer sig från konsoler och skrivbordsappar. Till exempel "Från det att webbtjänsten startas tills den stoppas" eller "från det att begäran tas emot tills svaret returneras". ASP.NET Framework Core, som kan placeras i Kärnan, ServiceLifetime.Scoped anger som standard. Om det inte finns någon särskild anledning kan du förbli så här.

Om du vill att programmet ska kunna komma åt databaskontexten lägger du Startup.ConfigureServices till den i:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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 typargument anger den kontextklass som du skapade.

options.UseSqlServer Metoden anger att SQL-servern används.

Configuration.GetConnectionString("TestDatabaseDbContext") anger det nyckelnamn som registrerats med appsettings.json.

ASP.NET användningsfall i Core MVC

ASP.NET finns flera sätt att använda Entity Framework Core i Core MVC.

Lägga till di (beroendeinfogning) i en styrenhet

Genom att registrera .cs services.AddDbContext metod vid start.cs TestDatabaseDbContext Den kan sättas in i styrenheten.

Ett exempel på DI HomeController är att konstruktorn har ett ILogger<HomeController> logger argument. Detta läggs till av DI. Du kan infoga TestDatabaseDbContext på samma sätt.

Om du HomeController vill lägga till i en befintlig ser det ut så här: Naturligtvis kan det läggas till andra styrenheter.

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 sedan komma åt databasen med hjälp av instansen av den mottagna kontexten i varje åtgärd.

Använda ärenden

Följande kod är koden som hanterar användarlistor och nya registreringar. Från och med ASP.NET kommer Entity Framework Core att vara kod för var och en, så jag kommer inte att förklara i detalj.

Den entitet Framework Core-genererade modellen kan fortfarande användas som modell för åtgärder. Du kan också skapa en separat modell och radbryta och använda modellen Entity Framework Core.

Kontexten ignoreras också automatiskt när användarens begäran är över.

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

  // ここまで追加

  // 省略
}

Eftersom det är besvärligt att skapa skärmen manuellt genereras listskärmen automatiskt av byggnadsställningar.

Den Views/Home/List.cshtml automatiskt genererade är följande:

@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 Lägg till en länk till skärmövergången i listan.

<!-- 省略 -->

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

Skärmen för användarregistrering genereras också automatiskt.

Den Views/Home/Create.cshtml automatiskt genererade är följande: Det är svårt att använda som det är, så jag har fixat det lite.

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

Spring och bekräfta. Förresten finns det inga säkerhetsåtgärder som lösenordsregistrering, så följ ASP.NET Core och databasregistreringsmetoder när du arbetar.

Naturligtvis återspeglas det i databasen.

Det här tipset skapar inte redigeringar eller borttagningar, så du kan använda redigering till höger | Detaljer | Ta bort" orsakar också ett fel. Du kan skapa den på samma sätt som Skapa, så prova den. Ovanstående tre processer har också lagts till i exempelkoden.

Hämta databaskontext från RequestServices

Att lägga till di i en styrenhetskonstruktör kan vara lite besvärligt eftersom du måste lägga till det i alla styrenheter du behöver. Alternativt kan RequestServices du få från .

Den ingår inte i provkoden, men den kan erhållas på följande sätt.

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

Skapa en databaskontext direkt

Det används också i konsoler och skrivbordsappar. Du kan använda den här metoden utan problem. Det rekommenderas inte eftersom omfattningen av transaktioner tenderar att vara tvetydig i webbprogram där samtidig åtkomst sannolikt kommer att ske. I synnerhet kanske uppdateringar inte kan återställas till en begäran-för-begäran-basis.

Om du öppnar databasen på det här sättet använder DbContext du en teknik för att härleda .

Ändra först Startup att arbeta 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 Skapa en klass TestDatabaseDbContextEx som härletts från och ställ in anslutningssträngen appsettings.json. Om du kan ställa in en anslutningssträng kan du använda en annan metod, till exempel att skicka den genom en konstruktor.

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

Om du vill komma åt databasen genererar och använder du instanser av de härledda klasserna.

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

ASP.NET exempel på en Core Razor-sida

ASP.NET sätt att använda Entity Framework Core på en Core Razor-sida.

Lägga till di (beroendeinfogning) i sidmodellen

Genom att registrera .cs services.AddDbContext metod vid start.cs TestDatabaseDbContext Den kan infogas i en sidmodell.

Ett exempel på DI IndexModel är att konstruktorn har ett ILogger<IndexModel> logger argument. Detta läggs till av DI. Du kan infoga TestDatabaseDbContext på samma sätt.

Om du IndexModel vill lägga till i en befintlig ser det ut så här: Naturligtvis kan det läggas till i andra sidmodeller.

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 sedan komma åt databasen med hjälp av instansen av kontexten du fick i varje process.

Använda ärenden

Följande kod är koden som hanterar användarlistor och nya registreringar. Både ASP.NET Core och Entity Framework Core kommer att vara kod, så jag kommer inte att gå in på detaljer. Kontexten ignoreras också automatiskt när användarens begäran är över.

Skapa en sidmodell för listskärmen.

List.cshtml.cs enligt följande:

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 skapas på följande sätt:

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

Lägg till den i Index.cshtml så att du kan gå över till listsidan.

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

Skapa också en användarregistreringsskärm.

Create.cshtml.cs koden enligt följande:

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 enligt följande:

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

Spring och bekräfta. Förresten finns det inga säkerhetsåtgärder som lösenordsregistrering, så följ ASP.NET Core och databasregistreringsmetoder när du arbetar.

Naturligtvis återspeglas det i databasen.

Jag har inte skapat några redigeringar eller borttagningar, så jag vill inte att redigeringen ska | Detaljer | Ta bort" orsakar också ett fel. Du kan skapa den på samma sätt som Skapa, så prova den. Ovanstående tre processer har också lagts till i exempelkoden.

Hämta databaskontext från RequestServices

Att lägga till di i en sidmodellkonstruktör är lite besvärligt eftersom du måste lägga till det i alla sidmodeller du behöver. Alternativt kan RequestServices du få från .

Den ingår inte i provkoden, men den kan erhållas på följande sätt.

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

Skapa en databaskontext direkt

Det används också i konsoler och skrivbordsappar. Du kan använda den här metoden utan problem. Det rekommenderas inte eftersom omfattningen av transaktioner tenderar att vara tvetydig i webbprogram där samtidig åtkomst sannolikt kommer att ske. I synnerhet kanske uppdateringar inte kan återställas till en begäran-för-begäran-basis.

Om du öppnar databasen på det här sättet använder DbContext du en teknik för att härleda .

Ändra först Startup att arbeta 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 Skapa en klass TestDatabaseDbContextEx som härletts från och ställ in anslutningssträngen appsettings.json. Om du kan ställa in en anslutningssträng kan du använda en annan metod, till exempel att skicka den genom en konstruktor.

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

Om du vill komma åt databasen genererar och använder du instanser av de härledda klasserna.

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