ASP.NET tietokantoja Käyttämällä Entiteettikehyksen ydintä

Sivun luontipäivämäärä :

Ympäristö

Visuaalinen studio
  • Visual Studio 2019
ASP.NET ydin
  • 3.1 (MVC, Razor-sivu)
SQL-palvelin
  • Vuoden 2019 pikajuna

Aluksi.

Tässä ASP.NET vaiheet, joiden avulla voit käyttää Entity Framework Corea seuraavan ydinlähestymistavan avulla.

Tietokannan luominen Entiteettikehyksen ytimen avulla ja niin edelleen eivät ole näiden vihjeiden pääpaino, joten emme mene yksityiskohtiin. Niitä ASP.NET samalla tavalla Coren ulkopuolella.

Tällä kertaa SQL Server asennetaan toiseen palvelimeen ja yhteys on yhdistetty SQL Server -todennuksella. Ainoa ero paikallisen asennuksen aikana käytettyihin Windows-todennukseen on yhteysmerkkijono, eikä ohjelmassa ole eroa.

Tietokantataulukon luominen

Tämä vihje käyttää SQL Serveriä. Asenna SQL Server paikalliseen ympäristöön tai mihin tahansa palvelimeen.

Jos sinulla ei ole testattavaa tietokantaa, luo tietokanta.

Jos luot SQL:ssä esimerkiksi seuraavan, muuta SQL Serverin versiopolku ja tietokannan nimi ympäristösi mukaan.

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

Luo taulukko testausta varten. Määritä päivitysten ja poistojen perusavain.

Jos haluat luoda sen SQL:ssä:

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

Lisää tietue näytettäväksi.

Jos haluat lisätä sen SQL:ään:

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 on käytettävissä Coressa

Tämä kohde on yleinen sekä MVC- että Razor-sivuilla.

Entiteettikehyksen ytimen pakettiasennus

Kun olet luonut projektin, hanki paketti NuGetista, jotta voit käyttää ensin Entity Framework Corea. MVC on esimerkki, mutta toiminto on sama partakoneen sivuilla.

Napsauta riippuvuudet projektista hiiren kakkospainikkeella ja valitse NuGet-pakettien hallinta.

Kun Selaa-välilehti on valittuna, kirjoita hakukenttään EntityFrameworkCore. Entiteettikehyksen ytimeen liittyvät paketit näkyvät luettelossa.

Tästä alkaen käytän SQL Serveriä, joten asennan seuraavat paketit.

  • Microsoft.EntityFrameworkCore -sivusto
  • Microsoft.EntityFrameworkCore.Tools -sivusto
  • Microsoft.EntityFrameworkCore.SqlServer -sivusto

Asennetaan esimerkiksi Microsoft.EntityFrameworkCore, joten asenna myös kaksi muuta.

Valitse asennettavat asetukset ja napsauta sitten asennuspainiketta. Versio valitsee uusimman stabilointiaineen.

Valintaikkuna on periaatteessa ok napsauttaa ok.

Asenna myös kaksi muuta.

Mielestäni paketti on seuraava.

Mallin (ohjelman) luominen tietokantataulukon kokoonpanosta

Jos haluat hakea tai päivittää tietoja Entiteettikehyksen ytimen tietokannasta, Yleensä on luotava ohjelma, joka on taulukon konfiguraatioon perustuva malli. Tätä mallia kutsutaan myös aliasentiteettiksi.

Kun luot mallin, koodin ensin, tekniikan taulukoiden luomiseksi tietokantaan mallista (ohjelmasta) tai Ensin on tietokanta, joka on tekniikka mallien (ohjelmien) luomiseen taulukoista. Tässä on yksinkertainen tietokannan ensimmäinen tapa ohjelmoida automaattisesti taulukosta.

Muuten, nämä vaiheet ASP.NET ytimeen, joten voit luoda ne konsolissa tai työpöytäsovelluksessa samalla tavalla.

Luo ensin projekti kerran varmistaaksesi, ettei virheitä ole. Jos virhe ilmenee, mallia ei voi luoda. Sinun ei tarvitse rakentaa sitä, jos olet jo varmistanut, että virheitä ei ole.

Avaa Visual Studiossa Package Manager -konsoli. Muussa tapauksessa voit avata sen valikon työkaluista, NuGet Package Managerista ja Package Manager -konsoleista.

Näet alla olevan ikkunan kaltaisen ikkunan, joten varmista, että oikeassa yläkulmassa oleva oletusprojekti on projekti, jonka haluat mallintaa. (Sinun on oltava varovainen, jos sinulla on useita projekteja)

Kirjoita syöttökenttään seuraava teksti: Parametrit vaihtelevat ympäristöstä riippuen, joten muuta ne ajoissa seuraavaan kuvaukseen. (erityisesti siellä, missä se on ***** erityisesti)

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

Tavutettu, -Provider kuten kunkin nimen päässä, on parametrin nimi ja sen jälkeen parametrin arvo.

Esimerkki parametrin kuvausparametrista
Tarjoaja Korjattu Microsoft.EntityFrameworkCore.SqlServer SQL Serverissä. Microsoft.EntityFrameworkCore.SqlServer -sivusto
Yhteys Yhteysmerkkijono yhteyden muodostamiseksi tietokantaan. Yhteysmerkkijonoja voidaan käyttää muissa yleisissä sovelluksissa, joten kirjoita, mitä määrität yhteysmerkkijonon kinekin mukaan. Sekä Windows-todennus että SQL Server -todennus ovat käytettävissä. Muuten, sitä käytetään vain väliaikaisesti mallin luomiseen, joten sinun ei tarvitse olla tietoinen turvallisuudesta sen jälkeen, kun sovellus on julkaistu tälle yhteysmerkkijonolle. Varo pakenemasta, jos salasanassasi on symboli. "Tietolähde=Palvelimennimi\SQLEXPRESS;Database=TestDatabase;käyttäjätunnus=Käyttäjänimi;salasana=***********"
F Pakota korvaaminen, vaikka ohjelma olisi jo olemassa. <Ei >
OutputDir-sivu Kansion polku, johon koodi tulostellaan. Suhteellinen polku projektikansiosta Mallit\Tietokanta
Yhteydessä Kontekstiluokan nimi entiteettikehystä käytettäessä TestaaDatabaseDbContext
Käytätietokannan nimiä Jos tämä on määritetty, tietokannan taulukon nimestä tulee sellaisenaan luokan nimi. Muussa tapauksessa asiainjärjestysnumeroa ja entiteettiluokan nimen monimuotoa muutetaan sääntöjen mukaisesti. <Ei >
DataHuomautukset Jos tämä on määritetty, saraketyyppi liittää DataAnnotation-määritteen automaattisesti kuonkin ominais ominais ominaisarvoon. Tämä on hieman hyödyllistä, jos haluat tarkistaa syötteen automaattisesti tietokannan tyypin mukaan. <Ei >

Kun suoritat Enter-näppäintä, se luo koodin automaattisesti seuraavasti:

Käyttäjä-taulukon mallikoodi on seuraava:

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

Varoitus muuten tulee näkyviin, koska yhteysmerkkijono näkyy sellaisena kuin se on luodun kontekstiluokan koodissa. Muista poistaa tämän OnConfiguring kontekstiluokan menetelmät koodin luomisen jälkeen.

Rekisteröi yhteysmerkkijonot

Tämä ASP.NET ydinkohtainen käsittely. (Jos mukautat sitä, voit käyttää sitä muissa .NET Core -sovelluksissa, ASP.NET mutta voit käsitellä sitä oletusarvoisesti Corelle.)

Package Manager -konsolissa määritettyä yhteysmerkkijonoa käytettiin vain mallin luomiseen.

Yhteysmerkkijono yhteyden muodostamiseksi tietokantaan verkkosovelluksena näkyy appsettings.json-sivustossa. Jos haluat muuttaa tietokannan kohdetta, johon haluat muodostaa yhteyden kunkin koontiversion tai julkaisun yhteydessä, voit käyttää appsettings-objekteja. Sitä voi myös haarastaa Development.json jne.

Lisäksi, koska täällä käytettävää yhteysmerkkijonoa käytetään toimintana, ryhdytään toimenpiteisiin, kuten tehdään yhteyden käyttäjästä omistautunut käyttäjä turvallisuuden kannalta jne.

Jos määrität sen arvoksi appsettings.json, luo ConnectionStrings-osa pääosaan (objekti, ei varsinaisesti osa). Luo siihen joukko avaimia ja arvoja. Avaimen nimi voi olla mikä tahansa, mutta sitä käytetään myöhemmin. Arvo määrittää yhteysmerkkijonon.

{
  // 

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

Entiteettikehyksen ytimen saaminen ohjelmien käyttöön

Tämä ASP.NET ydinkohtainen käsittely. (Jos mukautat sitä, voit käyttää sitä muissa .NET Core -sovelluksissa, ASP.NET mutta voit käsitellä sitä oletusarvoisesti Corelle.)

ASP.NET Coressa jokaisella esiintymällä on eloonjäämisaika, joka eroaa konsoleista ja työpöytäsovelluksista. Esimerkiksi "Siitä asti, kun Web-palvelu käynti aloitetaan, kunnes se pysäytetään" tai "siitä asti, kun pyyntö vastaanotetaan, siihen asti, kunnes vastaus palautetaan". ASP.NET, joka voidaan sijoittaa Ytimeen, määrittää ServiceLifetime.Scoped oletusarvoisesti. Jos erityistä syytä ei ole, voit pysyä sellaisena.

Jos haluat, että ohjelma voi käyttää tietokantakontekstia, lisää Startup.ConfigureServices se :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Menetelmän tyyppiargumentti määrittää luomasi kontekstiluokan.

options.UseSqlServer Menetelmä ilmaisee, että SQL Serveriä käytetään.

Configuration.GetConnectionString("TestDatabaseDbContext") määrittää appsettings.json-tiedostolla rekisteröidyn avaimen nimen.

ASP.NET käyttötapaus Core MVC:ssä

ASP.NET on useita tapoja käyttää Entity Framework Corea Ydin MVC:ssä.

Di:n (riippuvuussynnytys) lisääminen ohjaimeen

Rekisteröimällä .cs services.AddDbContext käynnistyksessä.cs TestDatabaseDbContext Se voidaan asettaa ohjaimeen.

Esimerkki DI:stä HomeController on se, että konstruktorilla on ILogger<HomeController> logger argumentti. Di lisää tämän. Voit lisätä TestDatabaseDbContext samalla tavalla.

Jos haluat HomeController lisätä aiemmin luotuun , se näyttää tältä: Tietenkin se voidaan lisätä muihin ohjaimista.

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

Tämän jälkeen voit käyttää tietokantaa käyttämällä vastaanotettua kontekstia kussakin imessä.

Käytä koteloita

Seuraava koodi on koodi, joka käsittelee käyttäjäluetteloita ja uusia rekisteröintejä. Tästä lähtien ASP.NET keskeinen, Entity Framework Core on koodi kullekin, joten en selitä yksityiskohtaisesti.

Entiteettikehyksen ytimen luomaa mallia voidaan edelleen käyttää toimintojen mallina. Voit myös luoda erillisen mallin ja rivitä ja käyttää Entity Framework Core -mallia.

Myös konteksti hylätään automaattisesti, kun käyttäjän pyyntö on ohi.

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

  // ここまで追加

  // 省略
}

Koska näytön luominen manuaalisesti on hankalaa, luettelonäyttö luodaan automaattisesti rakennustelineiden avulla.

Views/Home/List.cshtmlAutomaattisesti luotu on seuraava:

@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 Lisää linkki näyttösiirtymään luetteloon.

<!-- 省略 -->

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

Myös käyttäjän rekisteröintinäyttö luodaan automaattisesti.

Views/Home/Create.cshtmlAutomaattisesti luotu on seuraava: Sitä on vaikea käyttää sellaisenaan, joten olen korjannut sitä hieman.

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

Juokse ja vahvista. Muuten, ei ole olemassa turvatoimia, kuten salasanan rekisteröintiä, joten noudata ASP.NET core- ja tietokantarekisteröintimenetelmiä.

Se näkyy tietenkin tietokannassa.

Nämä vihjeet eivät luo muokkauksia tai poistoja, joten voit muokata niitä oikealle | Lisätietoja | Delete" aiheuttaa myös virheen. Voit luoda sen samalla tavalla kuin Luo, joten kokeile sitä. Edellä mainitut kolme prosessia on lisätty myös mallikoodiin.

Tietokannan kontekstin hankkiminen RequestServices-palvelusta

Di:n lisääminen ohjainkonstruktoriin voi olla hieman hankalaa, koska se on lisättävä kaikkiin tarvitseisi ohjaimista. Vaihtoehtoisesti RequestServices voit saada .

Se ei sisälly mallikoodiin, mutta se voidaan saada seuraavasti.

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

Tietokantakontekstin luominen suoraan

Sitä käytetään myös konsoleissa ja työpöytäsovelluksissa. Voit käyttää tätä menetelmää ilman ongelmia. Sitä ei suositella, koska tapahtumien laajuus on yleensä epäselvä Web-sovelluksissa, joissa samanaikainen käyttö on todennäköistä. Päivityksiä ei välttämättä voida perua pyynnöstä.

Jos käytät tietokantaa tällä tavalla, DbContext käytät -tekniikkaa .

Muokkaa ensin Startup -näätä -näätää niin, että se toimii -näädän Configuration static kanssa.

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

  // 省略
}

TestDatabaseDbContext Luo luokka, TestDatabaseDbContextEx joka on johdettu appsettings.json-yhteysmerkkijonosta, ja määritä se. Jos pystyt asettamaan yhteysmerkkijonon, voit käyttää toista tapaa, kuten siirtää sen konstruktorin läpi.

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

Jos haluat käyttää tietokantaa, luo johdettujen luokkien esiintymät ja käytä niitä.

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

ASP.NET esimerkki Core Razor -sivulla

ASP.NET useita tapoja käyttää Entity Framework Corea Core Razor -sivulla.

Di:n (riippuvuussynnytys) lisääminen sivumalliin

Rekisteröimällä .cs services.AddDbContext käynnistyksessä.cs TestDatabaseDbContext Se voidaan lisätä sivumalliin.

Esimerkki DI:stä IndexModel on se, että konstruktorilla on ILogger<IndexModel> logger argumentti. Di lisää tämän. Voit lisätä TestDatabaseDbContext samalla tavalla.

Jos haluat IndexModel lisätä aiemmin luotuun , se näyttää tältä: Tietenkin se voidaan lisätä muihin sivumalleihin.

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

Tämän jälkeen voit käyttää tietokantaa käyttämällä kussakin prosessissa saamasi kontekstin esiintymää.

Käytä koteloita

Seuraava koodi on koodi, joka käsittelee käyttäjäluetteloita ja uusia rekisteröintejä. Sekä ASP.NET Core että Entity Framework Core ovat koodi, joten en mene yksityiskohtiin. Myös konteksti hylätään automaattisesti, kun käyttäjän pyyntö on ohi.

Luo sivumalli luettelonäytölle.

List.cshtml.cs seuraavasti:

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 luodaan seuraavasti:

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

Lisää se Index.cshtml-tiedostoon, jotta voit siirtyä Luettelo-sivulle.

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

Luo myös käyttäjän rekisteröintinäyttö.

Create.cshtml.cs koodi seuraavasti:

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 seuraavasti:

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

Juokse ja vahvista. Muuten, ei ole olemassa turvatoimia, kuten salasanan rekisteröintiä, joten noudata ASP.NET core- ja tietokantarekisteröintimenetelmiä.

Se näkyy tietenkin tietokannassa.

En luonut muokkauksia tai poistoja, joten en halua muokata | Lisätietoja | Delete" aiheuttaa myös virheen. Voit luoda sen samalla tavalla kuin Luo, joten kokeile sitä. Edellä mainitut kolme prosessia on lisätty myös mallikoodiin.

Tietokannan kontekstin hankkiminen RequestServices-palvelusta

Di:n lisääminen sivumallin konstruktoriin on hieman hankalaa, koska se on lisättävä kaikkiin tarvitseisi sivumalleihin. Vaihtoehtoisesti RequestServices voit saada .

Se ei sisälly mallikoodiin, mutta se voidaan saada seuraavasti.

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

Tietokantakontekstin luominen suoraan

Sitä käytetään myös konsoleissa ja työpöytäsovelluksissa. Voit käyttää tätä menetelmää ilman ongelmia. Sitä ei suositella, koska tapahtumien laajuus on yleensä epäselvä Web-sovelluksissa, joissa samanaikainen käyttö on todennäköistä. Päivityksiä ei välttämättä voida perua pyynnöstä.

Jos käytät tietokantaa tällä tavalla, DbContext käytät -tekniikkaa .

Muokkaa ensin Startup -näätä -näätää niin, että se toimii -näädän Configuration static kanssa.

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

  // 省略
}

TestDatabaseDbContext Luo luokka, TestDatabaseDbContextEx joka on johdettu appsettings.json-yhteysmerkkijonosta, ja määritä se. Jos pystyt asettamaan yhteysmerkkijonon, voit käyttää toista tapaa, kuten siirtää sen konstruktorin läpi.

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

Jos haluat käyttää tietokantaa, luo johdettujen luokkien esiintymät ja käytä niitä.

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