ASP.NET bazelor de date utilizând Entity Framework Core in Core

Data creării paginii :

Mediu

Studio vizual
  • Studio vizual 2019
ASP.NET Core
  • 3.1 (MVC, pagina razor)
SQL Server
  • Expresul 2019

La început

Acest sfat ASP.NET pași pentru a utiliza Entity Framework Core utilizând abordarea Following Core.

Crearea unei baze de date, utilizând Entity Framework Core și așa mai departe nu sunt principalul obiectiv al acestor sfaturi, așa că nu vom intra în detalii. Ele ASP.NET folosite în același mod în afara Core.

De data aceasta, sql server este instalat pe un alt server și conectat prin autentificare SQL Server. Singura diferență față de autentificarea Windows utilizată în timpul unei instalări locale este șirul de conexiune și nu există nicio diferență în program.

Crearea unui tabel bază de date

Acest sfaturi utilizează SQL Server. Instalați SQL Server în mediul local sau pe orice server.

Dacă nu aveți o bază de date pentru testare, creați o bază de date.

Dacă creați în SQL, ar fi următoarele, modificați calea versiunii SQL Server și numele bazei de date pentru a se potrivi mediului dvs.

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

Creați un tabel pentru testare. Setați cheia primară pentru actualizări și ștergeri.

Dacă doriți să-l creați în 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

Adăugați o înregistrare pentru afișare.

Dacă doriți să-l adăugați în 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 cadru de entitate disponibil în

Acest element este comun atât pentru MVC și pagini razor.

Instalarea pachetului de nuclee de cadru de entitate

După ce ați creat proiectul, obțineți pachetul de la NuGet, astfel încât să puteți utiliza mai întâi Entity Framework Core. MVC este un exemplu, dar operația este aceeași pe paginile de ras.

Faceți clic cu dreapta pe Dependențe din proiect și selectați Gestionare pachete NuGet.

Cu Răsfoire selectată din filă, tastați EntityFrameworkCore în câmpul de căutare. Pachetele core-core ale cadrului de entitate apar în listă.

Din acest moment, voi folosi SQL Server, așa că voi instala următoarele pachete.

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

Să instalăm Microsoft.EntityFrameworkCore ca exemplu, deci instalați și celelalte două.

Selectați ce doriți să instalați, apoi faceți clic pe butonul de instalare. Versiunea selectează cel mai recent stabilizator.

Dialogul este practic ok pentru a face clic pe ok.

Instalați celelalte două, de asemenea.

Cred că pachetul este după urmează.

Crearea unui model (program) dintr-o configurație a tabelului bază de date

Dacă doriți să regăsiți sau să actualizați date dintr-o bază de date din Entity Framework Core, De obicei, trebuie să creați un program care este un model bazat pe configurația tabelului. Acest model este, de asemenea, numit o entitate alias.

Când creați mai întâi un model, codați o tehnică pentru crearea tabelelor într-o bază de date dintr-un model (program) sau Există mai întâi baza de date, care este o tehnică pentru crearea de modele (programe) din tabele. Iată o bază de date simplă-primul mod de a programa automat dintr-un tabel.

Apropo, acești pași sunt ASP.NET la Nucleu, astfel încât să le puteți crea în consolă sau în aplicația desktop în același mod.

În primul rând, construiți proiectul o dată pentru a vă asigura că nu există erori. Dacă există o eroare, modelul nu se poate crea. Nu trebuie să-l construiți dacă ați verificat deja că nu există erori.

Din Visual Studio, deschideți consola Package Manager. În caz contrar, îl puteți deschide din instrumentele, consolele NuGet Package Manager și Package Manager din meniu.

Veți vedea o fereastră similară cu cea de mai jos, deci asigurați-vă că Proiectul implicit din dreapta sus este proiectul pe care doriți să îl modelați. (Trebuie să aveți grijă dacă aveți mai multe proiecte)

În câmpul de intrare, tastați următorul text: Parametrii variază în funcție de mediu, așa că vă rugăm să îi schimbați în timp util la următoarea descriere. (mai ales în cazul în care este ***** în special)

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

Unul despărțit în silabe, -Provider cum ar fi în capul fiecărui nume, este numele parametrului, urmat de valoarea parametrului respectiv.

Exemplu parametru descriere parametru
Furnizor Fixat în Microsoft.EntityFrameworkCore.SqlServer SQL Server. Microsoft.EntityFrameworkCore.SqlServer
Conexiune Șir de conexiune pentru conectarea la baza de date. Șirurile de conexiune pot fi utilizate în alte aplicații în comun, așa că vă rugăm să scrieți ceea ce specificați în funcție de șirul de conexiune kineki. Sunt disponibile atât autentificarea Windows, cât și autentificarea SQL Server. Apropo, este utilizat doar temporar pentru a crea un model, deci nu trebuie să fiți conștienți de securitate după publicarea aplicației pentru acest șir de conexiune. Feriți-vă să scăpați dacă aveți un simbol în parolă. "Sursă de date=NumeServer\SQLEXPRESS;Bază de date=TestDatabase;id utilizator=NumeUtilizator;parolă=**********".
F Forțați suprascrierea chiar dacă există deja un program. <Nu >
IeșireDir Calea folderului în care se afișează codul. Cale relativă din folderul proiect Modele\Bază de date
Contextul Numele clasei contextuale atunci când se utilizează cadrul entității TestDatabaseDbContext
Utilizarea Numelor de bază de date Dacă este specificat, numele tabelului bazei de date devine numele clasei așa este. În caz contrar, cazul și forma multiplă a numelui clasei entității sunt ajustate în conformitate cu regulile. <Nu >
DateAnnotații Dacă este specificat, tipul de coloană adaugă automat atributul DataAnnotation la fiecare proprietate. Acest lucru este un pic util dacă doriți să verificați automat intrarea în funcție de tipul bazei de date. <Nu >

Apăsarea tastei Enter pentru executare va genera automat cod după urmează:

Codul modelului pentru tabelul Utilizator este următorul:

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

Apropo, avertismentul se afișează deoarece șirul de conexiune este listat așa este în codul clasei de context generate. Asigurați-vă că ștergeți OnConfiguring metodele din această clasă de context după generarea codului.

Înregistrarea șirurilor de conexiune

Aceasta ASP.NET procesare specifică nucleului. (Dacă îl particularizați, îl puteți utiliza în alte aplicații .NET Core, dar ASP.NET îl puteți gestiona în mod implicit pentru Core.)

Șirul de conexiune specificat în consola Package Manager a fost utilizat numai pentru a genera modelul.

Șirul de conexiune pentru conectarea la baza de date ca aplicație web este listat în appsettings.json. Dacă doriți să modificați destinația bazei de date la care să vă conectați pentru fiecare compilare sau publicație, puteți utiliza setările de aplicații. De asemenea, poate fi ramificat de Development.json etc.

În plus, deoarece șirul de conexiune de aici este utilizat ca operațiune, să luăm măsuri precum transformarea utilizatorului conexiunii într-un utilizator dedicat în considerarea securității etc.

Dacă îl setați la appsettings.json, creați o secțiune ConnectionStrings în secțiunea rădăcină (un obiect, nu chiar o secțiune). Creați un set de chei și valori în el. Numele cheii poate fi orice, dar va fi folosit mai târziu. Valoarea specifică un șir de conexiune.

{
  // 

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

Faceți Entity Framework Core disponibil pentru programe

Aceasta ASP.NET procesare specifică nucleului. (Dacă îl particularizați, îl puteți utiliza în alte aplicații .NET Core, dar ASP.NET îl puteți gestiona în mod implicit pentru Core.)

ASP.NET Core, fiecare instanță are un timp de supraviețuire, care este diferit de console și aplicații desktop. De exemplu, "Din momentul în care serviciul Web este pornit până când este oprit" sau "din momentul primirii solicitării până la returnarea răspunsului". ASP.NET framework Core, care poate fi plasat în The Core, ServiceLifetime.Scoped specifică în mod implicit. Dacă nu există un motiv special, poți rămâne așa.

Pentru a permite programului să acceseze contextul bazei de date, Startup.ConfigureServices adăugați-l la :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Argumentul tip al metodei specifică clasa de context pe care ați creat-o.

options.UseSqlServer Metoda indică faptul că se utilizează sql server.

Configuration.GetConnectionString("TestDatabaseDbContext") specifică numele cheii înregistrate la appsettings.json.

ASP.NET caz de utilizare în MVC-ul de bază

ASP.NET sunt mai multe moduri de a utiliza Entity Framework Core în Core MVC.

Adăugare di (inserare dependență) la un controler

Prin înregistrarea metodei .cs services.AddDbContext la pornire.cs TestDatabaseDbContext Acesta poate fi introdus în controler.

Un exemplu de DI HomeController este că constructorul are un ILogger<HomeController> logger argument. Acest lucru este adăugat de DI. Aveți posibilitatea să inserați TestDatabaseDbContext în același mod.

Dacă HomeController doriți să adăugați la un existent , se pare ca aceasta: Desigur, poate fi adăugat la alți controlori.

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

Apoi, aveți posibilitatea să accesați baza de date utilizând instanța contextului primit din fiecare acțiune.

Utilizarea carcaselor

Următorul cod este codul care se ocupă de listarea utilizatorilor și de înregistrările noi. De acum înainte ASP.NET bază, Entity Framework Core va fi cod pentru fiecare, așa că nu voi explica în detaliu.

Modelul de bază al entității poate fi utilizat în continuare ca model pentru acțiuni. De asemenea, aveți posibilitatea să creați un model separat și să încadrați și să utilizați modelul Entity Framework Core.

De asemenea, contextul este eliminat automat atunci când solicitarea utilizatorului este de peste.

AcasăControler.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));
  }

  // ここまで追加

  // 省略
}

Deoarece este supărător să creați ecranul manual, ecranul listei este generat automat de schele.

Views/Home/List.cshtmlAuto-generat este după urmează:

@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 Adăugați un link la tranziția ecranului la listă.

<!-- 省略 -->

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

Ecranul de înregistrare a utilizatorului este, de asemenea, generat automat.

Views/Home/Create.cshtmlAuto-generat este după urmează: Este dificil de utilizat așa este, așa că l-am reparat puțin.

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

Fugi și confirmă. Apropo, nu există măsuri de securitate, ar fi înregistrarea parolei, așa că vă rugăm să urmați ASP.NET Core și metodele de înregistrare a bazei de date atunci când funcționează.

Desigur, se reflectă în baza de date.

Acest Sfat nu creează editări sau ștergeri, astfel încât să puteți utiliza editarea în | Detalii | Ștergere" provoacă, de asemenea, o eroare. Puteți să-l creați în același mod ca creați, așa că încercați. Cele trei procese de mai sus au fost, de asemenea, adăugate la codul eșantion.

Obțineți contextul bazei de date de la RequestServices

Adăugarea di la un constructor de controler poate fi un pic greoaie, deoarece trebuie să-l adăugați la toate controlerele de care aveți nevoie. Alternativ, RequestServices puteți obține de la .

Nu este inclus în codul eșantionului, dar poate fi obținut după urmează.

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

Crearea directă a unui context de bază de date

De asemenea, este utilizat în console și aplicații desktop. Puteți utiliza această metodă fără probleme. Nu este recomandat, deoarece domeniul de aplicare al tranzacțiilor tinde să fie ambiguu în aplicațiile Web în cazul în care accesul simultan este probabil să apară. În special, este posibil ca actualizările să nu poată fi revenind la o solicitare la cerere.

Dacă accesați baza de date în acest mod, DbContext veți utiliza o tehnică pentru a obține .

Mai întâi, Startup modificați pentru a lucra cu 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 Creați o clasă TestDatabaseDbContextEx derivată din și setați șirul de conexiune appsettings.json. Dacă aveți posibilitatea să setați un șir de conexiune, aveți posibilitatea să luați o altă metodă, ar fi trecerea acestuia printr-un constructor.

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

Dacă doriți să accesați baza de date, generați și utilizați instanțe ale claselor derivate.

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

ASP.NET exemplu pe o pagină Core Razor

ASP.NET mai multe moduri de a utiliza Entity Framework Core pe o pagină Core Razor.

Adăugare di (inserare dependență) la modelul de pagină

Prin înregistrarea metodei .cs services.AddDbContext la pornire.cs TestDatabaseDbContext Acesta poate fi inserat într-un model de pagină.

Un exemplu de DI IndexModel este că constructorul are un ILogger<IndexModel> logger argument. Acest lucru este adăugat de DI. Aveți posibilitatea să inserați TestDatabaseDbContext în același mod.

Dacă IndexModel doriți să adăugați la un existent , se pare ca aceasta: Desigur, acesta poate fi adăugat la alte modele de pagini.

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

Apoi, aveți posibilitatea să accesați baza de date utilizând instanța contextului pe care l-ați primit în fiecare proces.

Utilizarea carcaselor

Următorul cod este codul care se ocupă de listarea utilizatorilor și de înregistrările noi. Ambele ASP.NET Core și Entity Framework Core vor fi cod, așa că nu voi intra în detalii. De asemenea, contextul este eliminat automat atunci când solicitarea utilizatorului este de peste.

Creați un model de pagină pentru ecranul listei.

List.cshtml.cs după urmează:

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 este creat după urmează:

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

Adăugați-l la Index.cshtml, astfel încât să puteți trece la pagina Listă.

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

Creați și un ecran de înregistrare a utilizatorului.

Codul create.cshtml.cs după urmează:

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 după urmează:

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

Fugi și confirmă. Apropo, nu există măsuri de securitate, ar fi înregistrarea parolei, așa că vă rugăm să urmați ASP.NET Core și metodele de înregistrare a bazei de date atunci când funcționează.

Desigur, se reflectă în baza de date.

Nu am creat nicio editare sau ștergere, așa că nu doresc ca editarea să | Detalii | Ștergere" provoacă, de asemenea, o eroare. Puteți să-l creați în același mod ca creați, așa că încercați. Cele trei procese de mai sus au fost, de asemenea, adăugate la codul eșantion.

Obțineți contextul bazei de date de la RequestServices

Adăugarea di la un constructor de model de pagină este un pic greoaie, deoarece va trebui să-l adăugați la toate modelele de pagini care aveți nevoie. Alternativ, RequestServices puteți obține de la .

Nu este inclus în codul eșantionului, dar poate fi obținut după urmează.

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

Crearea directă a unui context de bază de date

De asemenea, este utilizat în console și aplicații desktop. Puteți utiliza această metodă fără probleme. Nu este recomandat, deoarece domeniul de aplicare al tranzacțiilor tinde să fie ambiguu în aplicațiile Web în cazul în care accesul simultan este probabil să apară. În special, este posibil ca actualizările să nu poată fi revenind la o solicitare la cerere.

Dacă accesați baza de date în acest mod, DbContext veți utiliza o tehnică pentru a obține .

Mai întâi, Startup modificați pentru a lucra cu 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 Creați o clasă TestDatabaseDbContextEx derivată din și setați șirul de conexiune appsettings.json. Dacă aveți posibilitatea să setați un șir de conexiune, aveți posibilitatea să luați o altă metodă, ar fi trecerea acestuia printr-un constructor.

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

Dacă doriți să accesați baza de date, generați și utilizați instanțe ale claselor derivate.

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