ASP.NET datu bāzes, izmantojot entītiju struktūras kodolu pamattīkla

Lapas izveides datums :

Vides

Vizuālā studija
  • Visual Studio 2019
ASP.NET kodols
  • 3.1 (MVC, skuvekļa lapa)
SQL serveris
  • 2019. gada ekspresis

Sākumā

Šie padomi ASP.NET darbības, lai izmantotu entītiju struktūras kodolu, izmantojot šādu pamatiedarbības pieeju.

Datu bāzes izveide, izmantojot entītiju struktūras kodolu un tā tālāk, nav šo padomu galvenais mērķis, tāpēc mēs neieslīgsim detaļās. Tie ASP.NET izmantoti tādā pašā veidā ārpus Core.

Šoreiz SQL serveris ir instalēts citā serverī un savienots ar SQL Server autentifikāciju. Vienīgā atšķirība no Windows autentifikācijas, kas tiek izmantota lokālās instalēšanas laikā, ir savienojuma virkne, un programmā nav atšķirības.

Datu bāzes tabulas izveide

Šie padomi izmanto SQL Server. Instalējiet SQL Server lokālajā vidē vai jebkurā serverī.

Ja jums nav datu bāzes testēšanai, izveidojiet datu bāzi.

Ja veidojat SQL, piemēram, tālāk norādītās, mainiet SQL Server versijas ceļu un datu bāzes nosaukumu atbilstoši videi.

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

Izveidojiet tabulu testēšanai. Iestatiet primāro atslēgu atjauninājumiem un dzēšanai.

Ja vēlaties to izveidot 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

Pievienot parādāmo ierakstu.

Ja vēlaties to pievienot 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 struktūra , kas pieejama pamata

Šis postenis ir kopīgs gan MVC, gan Razor lapām.

Entītijas struktūras kodola pakotnes instalēšana

Kad esat izveidojis savu projektu, iegūstiet pakotni no NuGet, lai vispirms varētu izmantot entītiju struktūras kodolu. MVC ir piemērs, bet operācija ir tāda pati skuvekļa lapās.

Projektā ar peles labo pogu noklikšķiniet uz Atkarības un atlasiet Pārvaldīt NuGet pakotnes.

Cilnē atlasīta opcija Browse, meklēšanas laukā ierakstiet EntityFrameworkCore. Sarakstā tiek parādītas ar entītiju struktūras kodolu saistītās pakotnes.

No šī laika es izmantošu SQL Server, tāpēc es instalēšu šādas pakotnes.

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

Kā piemēru instalēsim Microsoft.EntityFrameworkCore, tāpēc instalējiet arī pārējos divus.

Atlasiet instalējamo vienumu un pēc tam noklikšķiniet uz pogas Instalēt. Versija izvēlas jaunāko stabilizatoru.

Dialogs būtībā ir ok, lai noklikšķiniet uz ok.

Instalējiet arī pārējos divus.

Es domāju, ka pakete ir šāda.

Modeļa (programmas) izveide no datu bāzes tabulas konfigurācijas

Ja vēlaties izgūt vai atjaunināt datus no entītiju struktūras kodola datu bāzes, Parasti ir jāizveido programma, kas ir modelis, kura pamatā ir tabulas konfigurācija. Šo modeli sauc arī par aizstājvārda entītiju.

Vispirms izveidojot modeli, kodu, metodi tabulu izveidei datu bāzē no modeļa (programmas) vai Vispirms ir datu bāze, kas ir metode modeļu (programmu) izveidei no tabulām. Šeit ir vienkāršs datu bāzes pirmais veids, kā automātiski programmēt no tabulas.

Starp citu, šīs darbības ASP.NET uz Kodols, lai jūs varētu tos izveidot konsolē vai datora lietotnē tādā pašā veidā.

Pirmkārt, izveidojiet projektu vienu reizi, lai pārliecinātos, ka nav kļūdu. Ja ir kļūda, modeli nevar izveidot. Jums tas nav jāveido, ja jau esat pārliecinājies, ka nav kļūdu.

Visual Studio atveriet pakotņu pārvaldnieka konsoli. Pretējā gadījumā to var atvērt no rīkiem, NuGet paku pārvaldnieka un paku pārvaldnieka konsolēm izvēlnē.

Tiks parādīts logs, kas līdzīgs tālāk redzamajā, tāpēc pārliecinieties, vai noklusējuma projekts augšējā labajā stūrī ir projekts, kuru vēlaties modelēt. (Jums ir jābūt uzmanīgiem, ja jums ir vairāki projekti)

Ievades laukā ierakstiet šādu tekstu: Parametri atšķiras atkarībā no vides, tāpēc, lūdzu, savlaicīgi nomainiet tos uz šādu aprakstu. (it īpaši, ja tas ir ***** jo īpaši)

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

Defisi, -Provider piemēram, katra nosaukuma sākumā, ir parametra nosaukums, kam seko šī parametra vērtība.

Parametra apraksta parametra piemērs
Sniedzēja Fiksēts Microsoft.EntityFrameworkCore.SqlServer SQL Server. Microsoft.EntityFrameworkCore.SqlServer
Savienojumu Savienojuma virkne savienojuma izveidei ar datu bāzi. Savienojuma virknes var izmantot citās lietotnēs, tāpēc, lūdzu, rakstiet to, ko norādāt atbilstoši savienojuma virknei kineki. Ir pieejama gan Windows autentifikācija, gan SQL Server autentifikācija. Starp citu, tas tiek izmantots tikai īslaicīgi, lai izveidotu modeli, tāpēc jums nav jāapzinās drošība pēc tam, kad lietotne ir publicēta šai savienojuma virknei. Uzmanieties no izbēgšanas, ja jūsu parolē ir simbols. "Data Source=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=********"
F Piespiediet pārrakstīšanu pat tad, ja jau ir programma. <Nē >
OutputDir (OutputDir) Mapes ceļš, uz kuru tiek izvadīts kods. Relatīvais ceļš no projekta mapes Modeļi\Datu bāze
Kontekstā Konteksta klases nosaukums, izmantojot entītiju struktūru TestDatabaseDbKonteksts
LietotDatabaseNames Ja norādīts, datu bāzes tabulas nosaukums kļūst par klases nosaukumu, kāds tas ir. Pretējā gadījumā gadījums un entītijas klases nosaukuma daudzkārtējās formas tiek koriģētas atbilstoši noteikumiem. <Nē >
Datu anotācijas Ja norādīts, kolonnas tips katram rekvizītam automātiski pievieno atribūtu DataAnnotation. Tas ir nedaudz noderīgi, ja vēlaties automātiski pārbaudīt ievadi atbilstoši datu bāzes tipam. <Nē >

Nospiežot taustiņu Enter, lai to palaistu, automātiski tiks ģenerēts šāds kods:

Tabulas Lietotājs modeļa kods ir šāds:

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

Starp citu, brīdinājums tiek parādīts, jo savienojuma virkne ir norādīta tā, kā tā ir ģenerētās konteksta klases kodā. Noteikti izdzēsiet OnConfiguring metodes šajā konteksta klasē pēc koda ģenerēšanas.

Reģistrēt savienojumu virknes

Tas ASP.NET specifisku apstrādi. (Ja to pielāgojat, varat to izmantot citās .NET Core lietojumprogrammās, bet ASP.NET pēc noklusējuma varat to apstrādāt core.)

Pakotnes pārvaldnieka konsolē norādītā savienojuma virkne tika izmantota tikai modeļa ģenerēšanai.

Savienojuma virkne savienojuma izveidei ar datu bāzi kā tīmekļa lietojumprogrammu ir norādīta vietnē appsettings.json. Ja vēlaties mainīt datu bāzes mērķi, ar kuru izveidot savienojumu katram būvējumam vai publikācijai, varat izmantot lietojumprogrammu iestatījumus. To var sazarot arī Development.json u.c.

Turklāt, tā kā savienojuma virkne šeit tiek izmantota kā darbība, slēgsim tādus pasākumus kā savienojuma lietotāja padarīšana par īpašu lietotāju, ņemot vērā drošību utt.

Ja iestatāt to uz appsettings.json, saknes sadaļā izveidojiet sadaļu ConnectionStrings (objekts, nevis tieši sadaļa). Izveidojiet tajā atslēgu un vērtību kopu. Atslēgas nosaukums var būt jebkas, bet tas tiks izmantots vēlāk. Vērtība norāda savienojuma virkni.

{
  // 

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

Entītiju struktūras kodola padarīšana par pieejamu programmām

Tas ASP.NET specifisku apstrādi. (Ja to pielāgojat, varat to izmantot citās .NET Core lietojumprogrammās, bet ASP.NET pēc noklusējuma varat to apstrādāt core.)

ASP.NET Core katram gadījumam ir izdzīvošanas laiks, kas atšķiras no konsolēm un datora programmām. Piemēram, "No tīmekļa pakalpojuma starta līdz tā atstāšanas brīdim" vai "no pieprasījuma saņemšanas līdz atbildes atdusai". ASP.NET Core, ko var ievietot ServiceLifetime.Scoped Kodols, norāda pēc noklusējuma. Ja nav īpaša iemesla, jūs varat palikt šādā veidā.

Lai ļautu programmai piekļūt datu bāzes kontekstam, Startup.ConfigureServices pievienojiet to:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Metodes tipa arguments norāda izveidoto konteksta klasi.

options.UseSqlServer Metode norāda, ka tiek izmantots SQL serveris.

Configuration.GetConnectionString("TestDatabaseDbContext") Norāda atslēgas nosaukumu, kas reģistrēts ar appsettings.json.

ASP.NET lietošanas gadījums pamata MVC

ASP.NET ir vairāki veidi, kā izmantot vienības struktūras kodolu core MVC.

Di (atkarības ievietošanas) pievienošana kontrollerim

Reģistrējot .cs services.AddDbContext metodi startēšanas laikā.cs TestDatabaseDbContext To var ievietot kontrollerī.

DI piemērs ir HomeController tāds, ka konstruktoram ir ILogger<HomeController> logger arguments. To pievieno DI. To var TestDatabaseDbContext ievietot tādā pašā veidā.

Ja HomeController vēlaties pievienot esošai , tas izskatās šādi: Protams, to var pievienot citiem kontrolieriem.

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

Pēc tam datu bāzei var piekļūt, izmantojot saņemtā konteksta gadījumu katrā darbībā.

Izmantot pieteikumus

Šis kods ir kods, kas apstrādā lietotāju sarakstu un jaunas reģistrācijas. No šī ASP.NET kodola, vienības struktūras kodols būs kods katram, tāpēc es sīkāk nepaskaidrošu.

Entītiju struktūras kodola ģenerēto modeli joprojām var izmantot kā darbību modeli. Varat arī izveidot atsevišķu modeli un aplauzt un izmantot entītijas struktūras pamatmodeli.

Arī konteksts tiek automātiski atmests, kad lietotāja pieprasījums ir beidzies.

SākumsKontrole.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));
  }

  // ここまで追加

  // 省略
}

Tā kā ir apgrūtinoši izveidot ekrānu manuāli, saraksta ekrānu automātiski ģenerē sastatnes.

Automātiski Views/Home/List.cshtml ģenerētais ir šāds:

@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 Pievienojiet sarakstam saiti uz ekrāna pāreju.

<!-- 省略 -->

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

Automātiski tiek ģenerēts arī lietotāja reģistrācijas ekrāns.

Automātiski Views/Home/Create.cshtml ģenerētais ir šāds: Ir grūti izmantot, kā tas ir, tāpēc es to esmu nedaudz fiksējis.

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

Palaidiet un apstipriniet. Starp citu, nav nekādu drošības pasākumu, piemēram, paroles reģistrācija, tāpēc, lūdzu, ASP.NET un datu bāzes reģistrācijas metodes.

Protams, tas atspoguļojas datu bāzē.

Šis tips neizveido labojumus vai dzēsumus, tāpēc varat izmantot rediģēšanu pa labi | Detalizēta informācija | Delete" arī izraisa kļūdu. To var izveidot tāpat kā Izveidot, tāpēc izmēģiniet to. Iepriekš minētie trīs procesi ir pievienoti arī izlases kodam.

Iegūt datu bāzes kontekstu no RequestServices

Di pievienošana kontroliera konstruktoram var būt nedaudz apgrūtinoša, jo jums tas jāpievieno visiem nepieciešamajam kontrolieriem. Alternatīvi, RequestServices jūs varat saņemt no .

Tas nav iekļauts izlases kodā, bet to var iegūt šādi.

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

Datu bāzes konteksta izveide tieši

To izmanto arī konsolēs un datora programmās. Jūs varat izmantot šo metodi bez jebkādām problēmām. Tas nav ieteicams, jo darījumu tvērums parasti ir neskaidrs Tīmekļa lietojumprogrammās, kurās var rasties vienlaicīga piekļuve. Jo īpaši atjauninājumus, iespējams, nevarēs atritināt uz pieprasījumu pēc pieprasījuma.

Ja datu bāzei piekļūstat šādā DbContext veidā, jūs izmantosiet metodi, lai iegūtu .

Vispirms Startup modificējiet , lai strādātu ar 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 Izveidojiet TestDatabaseDbContextEx klasi, kas atvasināta no savienojuma virknes appsettings.json, un iestatiet to. Ja varat iestatīt savienojuma virkni, varat izmantot citu metodi, piemēram, nodot to caur konstruktoru.

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

Ja vēlaties piekļūt datu bāzei, ģenerējiet un izmantojiet atvasināto klašu gadījumus.

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

ASP.NET piemērs Core Razor lapā

ASP.NET vairāki veidi, kā izmantot entītiju struktūras kodolu core skuvekļa lapā.

Pievienot di (atkarības ievietošana) lappuses modelim

Reģistrējot .cs services.AddDbContext metodi startēšanas laikā.cs TestDatabaseDbContext To var ievietot lapas modelī.

DI piemērs ir IndexModel tāds, ka konstruktoram ir ILogger<IndexModel> logger arguments. To pievieno DI. To var TestDatabaseDbContext ievietot tādā pašā veidā.

Ja IndexModel vēlaties pievienot esošai , tas izskatās šādi: Protams, to var pievienot citiem lapu modeļiem.

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

Pēc tam datu bāzei var piekļūt, izmantojot katrā procesā saņemtā konteksta instanci.

Izmantot pieteikumus

Šis kods ir kods, kas apstrādā lietotāju sarakstu un jaunas reģistrācijas. Gan ASP.NET Core, gan Entity Framework Core būs kods, tāpēc es neieslīgšu detaļās. Arī konteksts tiek automātiski atmests, kad lietotāja pieprasījums ir beidzies.

Izveidojiet lapas modeli saraksta ekrānam.

List.cshtml.cs šādi:

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 ir izveidots šādi:

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

Pievienojiet to Index.cshtml, lai varētu pāriet uz saraksta lapu.

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

Izveidojiet arī lietotāja reģistrācijas ekrānu.

Create.cshtml.cs kodu šādi:

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 šādi:

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

Palaidiet un apstipriniet. Starp citu, nav nekādu drošības pasākumu, piemēram, paroles reģistrācija, tāpēc, lūdzu, ASP.NET un datu bāzes reģistrācijas metodes.

Protams, tas atspoguļojas datu bāzē.

Nav izveidoti labojumi vai dzēšanas, tāpēc nevēlos, lai rediģēšana | Detalizēta informācija | Delete" arī izraisa kļūdu. To var izveidot tāpat kā Izveidot, tāpēc izmēģiniet to. Iepriekš minētie trīs procesi ir pievienoti arī izlases kodam.

Iegūt datu bāzes kontekstu no RequestServices

Di pievienošana lapas modeļa konstruktoram ir nedaudz apgrūtinoša, jo jums tā ir jāpievieno visiem nepieciešamajam lapu modelim. Alternatīvi, RequestServices jūs varat saņemt no .

Tas nav iekļauts izlases kodā, bet to var iegūt šādi.

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

Datu bāzes konteksta izveide tieši

To izmanto arī konsolēs un datora programmās. Jūs varat izmantot šo metodi bez jebkādām problēmām. Tas nav ieteicams, jo darījumu tvērums parasti ir neskaidrs Tīmekļa lietojumprogrammās, kurās var rasties vienlaicīga piekļuve. Jo īpaši atjauninājumus, iespējams, nevarēs atritināt uz pieprasījumu pēc pieprasījuma.

Ja datu bāzei piekļūstat šādā DbContext veidā, jūs izmantosiet metodi, lai iegūtu .

Vispirms Startup modificējiet , lai strādātu ar 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 Izveidojiet TestDatabaseDbContextEx klasi, kas atvasināta no savienojuma virknes appsettings.json, un iestatiet to. Ja varat iestatīt savienojuma virkni, varat izmantot citu metodi, piemēram, nodot to caur konstruktoru.

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

Ja vēlaties piekļūt datu bāzei, ģenerējiet un izmantojiet atvasināto klašu gadījumus.

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