Andmebaaside ASP.NET core'is entity Framework Core'i abil

Lehe loomise kuupäev :

Keskkond

Visuaalstuudio
  • Visuaalstuudio 2019
ASP.NET Tuum
  • 3.1 (MVC, Razori leht)
SQL Server
  • 2019 Ekspress

Alguses

Need näpunäited ASP.NET samme entity Framework Core'i kasutamiseks, kasutades järgmist põhiprintsiipi.

Andmebaasi loomine olemi raamistiku tuuma abil jne ei ole selle näpunäite peamine fookus, nii et me ei lasku üksikasjadesse. Neid ASP.NET kasutada samamoodi väljaspool Core'i.

Seekord installitakse SQL server teise serverisse ja ühendatakse SQL Serveri autentimisega. Ainus erinevus kohaliku installimise ajal kasutatavast Windowsi autentimisest on ühendusstring ja programmis pole erinevust.

Andmebaasitabeli loomine

See näpunäide kasutab SQL Serverit. Installige SQL Server kohalikus keskkonnas või mis tahes serveris.

Kui teil pole testimiseks andmebaasi, looge andmebaas.

Kui loote SQL-is (nt järgmised), muutke SQL Serveri versiooni tee ja andmebaasi nimi vastavalt oma keskkonnale.

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

Saate testimiseks luua tabeli. Seadke värskenduste ja kustutamiste primaarvõti.

Kui soovite selle SQL-is luua, tehke järgmist.

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

Saate lisada kirje kuvamiseks.

Kui soovite selle LISADA SQL-i, tehke järgmist.

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

core'is kättesaadav ASP.NET üksuse raamistik

See punkt on ühine nii MVC kui ka Razor lehekülgedele.

Olemi raamistiku tuuma paketi installimine

Kui olete oma projekti loonud, hankige pakett NuGetist, et saaksite esmalt kasutada entity Framework Core'i. MVC on näide, kuid toiming on sama razor lehekülgedel.

Paremklõpsake projekti sõltuvusi ja valige Halda NuGet pakette.

Kui vahekaardilt on valitud sirvimine, tippige otsinguväljale EntityFrameworkCore. Loendis kuvatakse olemi raamistiku core'iga seotud paketid.

Sellest ajast alates kasutan SQL Serverit, nii et installin järgmised paketid.

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

Installime näitena Microsoft.EntityFrameworkCore'i, nii et installige ka ülejäänud kaks.

Valige, mida soovite installida, ja seejärel klõpsake installimisnuppu. Versioon valib uusima stabilisaatori.

Dialoog on põhimõtteliselt ok, et klõpsata ok.

Installige ka ülejäänud kaks.

Arvan, et pakett on järgmine.

Mudeli (programmi) loomine andmebaasitabeli konfiguratsioonist

Kui soovite tuua või värskendada andmeid entity Framework Core'i andmebaasist, Tavaliselt peate looma programmi, mis on tabeli konfiguratsioonil põhinev mudel. Seda mudelit nimetatakse ka pseudonüümi olemiks.

Mudeli loomisel esmalt kood, mudelist (programmist) andmebaasi tabelite loomise tehnika või Kõigepealt on olemas andmebaas, mis on meetod mudelite (programmide) loomiseks tabelitest. Siin on lihtne andmebaasi esimene viis tabelist automaatseks programmeerimiseks.

Muide, need sammud on ASP.NET Core'iga, nii et saate neid konsoolis või töölauarakenduses samamoodi luua.

Esmalt ehitage projekt üks kord, veendumaks, et tõrkeid ei esine. Tõrke korral ei saa mudelit luua. Te ei pea seda ehitama, kui olete juba kontrollinud, et tõrkeid pole.

Avage Visual Studios Package Manageri konsool. Vastasel juhul saate selle avada menüü tööriistade, NuGet Package Manageri ja Package Manageri konsoolide kaudu.

Näete ülaltooduga sarnast akent, seega veenduge, et paremas ülanurgas olev vaikeprojekt oleks projekt, mida soovite modelleerida. (Kui teil on mitu projekti, peate olema ettevaatlik)

Tippige sisestusväljale järgmine tekst: Parameetrid varieeruvad sõltuvalt keskkonnast, nii et palun muutke need õigeaegselt järgmisele kirjeldusele. (eriti kui see on ***** eriti)

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

Poolitatud -Provider nimi, näiteks iga nime eesotsas, on parameetri nimi, millele järgneb selle parameetri väärtus.

Parameetri kirjelduse parameetri näide
Pakkuja Parandatud Microsoft.EntityFrameworkCore.SqlServer SQL Serveris. Microsoft.EntityFrameworkCore.SqlServer
Ühendus Ühendusstring andmebaasiga ühenduse loomiseks. Ühendusstringe saab kasutada teistes tavalistes rakendustes, nii et palun kirjutage, mida määrate vastavalt ühendusstringi kinekile. Saadaval on nii Windowsi autentimine kui ka SQL Serveri autentimine. Muide, seda kasutatakse ainult ajutiselt mudeli loomiseks, nii et te ei pea olema teadlik turvalisusest pärast rakenduse avaldamist selle ühendusstringi jaoks. Hoiduge põgenemisest, kui teie paroolis on sümbol. "Andmeallikas=Serveri nimi\SQLEXPRESS;Andmebaas=TestDatabase;kasutaja id=Kasutajanimi;parool=**********"
F Sundige ülekirjutamist isegi siis, kui programm on juba olemas. <Ei >
OutputDir Kausta tee, kuhu kood väljastatakse. Suhteline tee projektikaustast Mudelid\Andmebaas
Kontekstis Kontekstiklassi nimi olemiraamistiku kasutamisel TestDatabaseDbContext
UseDatabaseNames Kui see on määratud, muutub andmebaasi tabeli nimi klassi nimeks sellisena, nagu see on. Muul juhul kohandatakse olemiklassi nime teenindusjuhtumit ja mitmekordset vormi vastavalt reeglitele. <Ei >
Andmemarginaalid Kui see on määratud, lisab veerutüüp igale atribuudile automaatselt atribuudi DataAnnotation. See on natuke kasulik, kui soovite sisendit automaatselt kontrollida vastavalt andmebaasi tüübile. <Ei >

Sisestusklahvi (Enter) käivitamiseks vajutades genereeritakse kood automaatselt järgmiselt:

Tabeli Kasutaja mudelikood on järgmine:

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

Muide, hoiatus kuvatakse, kuna ühendusstring on loetletud nii, nagu see on loodud kontekstiklassi koodis. Kustutage OnConfiguring kindlasti selle kontekstiklassi meetodid pärast koodi loomist.

Registreeri ühendusstringid

See ASP.NET põhispetsiifiline töötlemine. (Kui kohandate seda, saate seda kasutada muudes .NET Core'i rakendustes, kuid ASP.NET saate seda Core'i jaoks vaikimisi käsitseda.)

Package Manageri konsoolis määratud ühendusstringi kasutati ainult mudeli loomiseks.

Ühendusstring andmebaasiga veebirakendusena ühenduse loomiseks on loetletud failis appsettings.json. Kui soovite muuta andmebaasi sihtkohta, millega iga järgu või publikatsiooni jaoks ühendust luua, saate kasutada rakendusi. Seda saab hargneda ka Development.json jne.

Lisaks, kuna siin kasutatakse ühenduse stringi operatsioonina, võtame meetmeid, näiteks muudame ühenduse kasutaja turvalisuse ga arvestamiseks spetsiaalseks kasutajaks jne.

Kui seate selle failiks appsettings.json, looge juurjaotises jaotis ConnectionStrings (objekt, mitte just jaotis). Looge selles võtmete ja väärtuste kogum. Võtme nimi võib olla mis iganes, kuid seda kasutatakse hiljem. Väärtus määrab ühendusstringi.

{
  // 

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

Olemi raamistiku tuuma programmidele kättesaadavaks tegemine

See ASP.NET põhispetsiifiline töötlemine. (Kui kohandate seda, saate seda kasutada muudes .NET Core'i rakendustes, kuid ASP.NET saate seda Core'i jaoks vaikimisi käsitseda.)

core'ASP.NET on igal eksemplaril ellujäämisaeg, mis erineb konsoolidest ja töölauarakendustest. Näiteks "Alates veebiteenuse käivitamisest kuni selle peatamiseni" või "alates taotluse saamisest kuni vastuse tagastamiseni". ASP.NET raamistik Core, mida saab paigutada Core'i, ServiceLifetime.Scoped määrab vaikimisi. Kui erilist põhjust ei ole, võite siia jääda.

Kui soovite, et teie programm pääseks juurde andmebaasi Startup.ConfigureServices kontekstile, lisage see:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Meetodi tüübiargument määrab teie loodud kontekstiklassi.

options.UseSqlServer Meetod näitab, et kasutatakse SQL-serverit.

Configuration.GetConnectionString("TestDatabaseDbContext") määrab võtme nime, mis on registreeritud failiga appsettings.json.

ASP.NET kasutusjuhtum Core MVC-s

ASP.NET on mitmeid viise, kuidas kasutada entity Framework Core'i põhi-MVC-s.

Di (sõltuvuse lisamine) lisamine kontrollerile

Registreerides .cs services.AddDbContext meetodi käivitamisel.cs TestDatabaseDbContext Selle saab lisada kontrollerisse.

DI näiteks HomeController on see, et konstruktoril on ILogger<HomeController> logger argument. Selle lisab DI. Saate lisada TestDatabaseDbContext samamoodi.

Kui HomeController soovite lisada olemasolevasse rakendusse , näeb see välja järgmine: Loomulikult saab seda lisada teistele kontrolleritele.

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

Seejärel pääsete andmebaasile juurde, kasutades iga toimingu vastuvõetud konteksti eksemplari.

Kasuta teenindusjuhtumeid

Järgmine kood on kood, mis käsitleb kasutajate kirjet ja uusi registreerimisi. Nüüdsest ASP.NET tuumik, entity Framework Core on kood iga, nii et ma ei selgita üksikasjalikult.

Üksuse Framework Core loodud mudelit saab endiselt kasutada tegevuste mudelina. Samuti saate luua eraldi mudeli ja mähkida ning kasutada olemi raamistiku põhimudelit.

Samuti hüljatakse kontekst automaatselt, kui kasutaja taotlus on lõppenud.

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

  // ここまで追加

  // 省略
}

Kuna ekraani käsitsi loomine on tülikas, luuakse loendiekraan tellingute abil automaatselt.

Views/Home/List.cshtmlAutomaatselt loodud on järgmine:

@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 Saate lisada loendisse ekraaniülemineku lingi.

<!-- 省略 -->

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

Automaatselt luuakse ka kasutaja registreerimise kuva.

Views/Home/Create.cshtmlAutomaatselt loodud on järgmine: Seda on raske kasutada, nii et ma olen selle veidi parandanud.

@model DatabaseEntityFrameworkCoreMvc.Models.Database.User

@{
  ViewData["Title"] = "Create";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="ID" class="control-label"></label>
        <input asp-for="ID" class="form-control" />
        <span asp-validation-for="ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Password" class="control-label"></label>
        <input asp-for="Password" class="form-control" type="password" /> <!-- type="password" 追加 -->
        <span asp-validation-for="Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Age" class="control-label"></label>
        <input asp-for="Age" class="form-control" />
        <span asp-validation-for="Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Email" class="control-label"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Birthday" class="control-label"></label>
        <input asp-for="Birthday" class="form-control" type="date" /> <!-- type="date" 追加 -->
        <span asp-validation-for="Birthday" class="text-danger"></span>
      </div>
      @* 更新日時は入力しないのでコメントアウト *@
      @*
      <div class="form-group">
        <label asp-for="UpdateDateTime" class="control-label"></label>
        <input asp-for="UpdateDateTime" class="form-control "/>
        <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
      </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
    <a asp-action="List">Back to List</a>  <!-- List に遷移するように変更 -->
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

Käivitage ja kinnitage. Muide, puuduvad turvameetmed, nagu parooli registreerimine, nii et palun järgige töötamisel ASP.NET Core ja andmebaasi registreerimise meetodeid.

Loomulikult kajastub see andmebaasis.

See näpunäide ei loo muudatusi ega kustutamisi, seega saate redigeerimist kasutada paremal | Üksikasjad | Kustuta" põhjustab ka tõrke. Saate selle luua samamoodi nagu loomine, nii et proovige seda. Näidiskoodile on lisatud ka eespool nimetatud kolm protsessi.

Andmebaasikonteksti toomine RequestServicesist

Di lisamine kontrolleri konstruktorile võib olla veidi tülikas, sest peate selle lisama kõigile vajalikkuele kontrolleritele. Teise võimalusena RequestServices saate .

See ei sisaldu näidiskoodis, kuid selle võib saada järgmiselt.

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

Andmebaasikonteksti loomine otse

Seda kasutatakse ka konsoolides ja töölauarakendustes. Seda meetodit saate kasutada ilma probleemideta. See ei ole soovitatav, sest tehingute ulatus kipub olema ebaselge veebirakendustes, kus samaaegne juurdepääs on tõenäoline. Eelkõige ei pruugi olla võimalik ajakohastusi taotluse alusel tagasi pöörata.

Kui pääsete andmebaasile sel viisil juurde, DbContext kasutate selle tuletamiseks tehnikat .

Esmalt Startup muutke . 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 Looge ühenduse TestDatabaseDbContextEx stringist appsettings.json tuletatud klass ja seadke see. Kui saate seada ühendusstringi, võite kasutada mõnda muud meetodit, näiteks selle läbimist konstruktori kaudu.

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

Kui soovite andmebaasile juurde pääseda, looge ja kasutage tuletatud klasside eksemplare.

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

ASP.NET näide Core Razori lehel

ASP.NET core Razori lehel mitu võimalust entity Framework Core'i kasutamiseks.

Di (sõltuvuse lisamine) lisamine leheküljemudelisse

Registreerides .cs services.AddDbContext meetodi käivitamisel.cs TestDatabaseDbContext Selle saab lisada leheküljemudelisse.

DI näiteks IndexModel on see, et konstruktoril on ILogger<IndexModel> logger argument. Selle lisab DI. Saate lisada TestDatabaseDbContext samamoodi.

Kui IndexModel soovite lisada olemasolevasse rakendusse , näeb see välja järgmine: Loomulikult saab seda lisada teistele leheküljemudelitele.

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

Seejärel pääsete andmebaasile juurde igas protsessis saadud konteksti eksemplari abil.

Kasuta teenindusjuhtumeid

Järgmine kood on kood, mis käsitleb kasutajate kirjet ja uusi registreerimisi. Nii ASP.NET Core kui ka Entity Framework Core on kood, nii et ma ei lasku üksikasjadesse. Samuti hüljatakse kontekst automaatselt, kui kasutaja taotlus on lõppenud.

Saate loendikuvale luua leheküljemudeli.

List.cshtml.cs järgmiselt:

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 on loodud järgmiselt:

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

Lisage see faili Index.cshtml, et saaksite minna üle loendilehele.

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

Looge ka kasutaja registreerimise kuva.

Create.cshtml.cs kood järgmiselt:

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:

@page
@model DatabaseEntityFrameworkCoreRazor.Pages.CreateModel
@{
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="UserInfo.ID" class="control-label"></label>
        <input asp-for="UserInfo.ID" class="form-control" />
        <span asp-validation-for="UserInfo.ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Name" class="control-label"></label>
        <input asp-for="UserInfo.Name" class="form-control" />
        <span asp-validation-for="UserInfo.Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Password" class="control-label"></label>
        <input asp-for="UserInfo.Password" class="form-control" type="password" />
        <span asp-validation-for="UserInfo.Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Age" class="control-label"></label>
        <input asp-for="UserInfo.Age" class="form-control" />
        <span asp-validation-for="UserInfo.Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Email" class="control-label"></label>
        <input asp-for="UserInfo.Email" class="form-control" />
        <span asp-validation-for="UserInfo.Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Birthday" class="control-label"></label>
        <input asp-for="UserInfo.Birthday" class="form-control" type="date" />
        <span asp-validation-for="UserInfo.Birthday" class="text-danger"></span>
      </div>
      @*
        <div class="form-group">
          <label asp-for="UpdateDateTime" class="control-label"></label>
          <input asp-for="UpdateDateTime" class="form-control" />
          <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
        </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
  <a asp-page="List">Back to List</a>
</div>

Käivitage ja kinnitage. Muide, puuduvad turvameetmed, nagu parooli registreerimine, nii et palun järgige töötamisel ASP.NET Core ja andmebaasi registreerimise meetodeid.

Loomulikult kajastub see andmebaasis.

Ma ei loonud ühtegi muudatust ega kustutamist, seega ei soovi redigeerimine | Üksikasjad | Kustuta" põhjustab ka tõrke. Saate selle luua samamoodi nagu loomine, nii et proovige seda. Näidiskoodile on lisatud ka eespool nimetatud kolm protsessi.

Andmebaasikonteksti toomine RequestServicesist

Di lisamine lehemudeli konstruktorile on natuke tülikas, kuna peate selle lisama kõigile vajaminevatele leheküljemudelitele. Teise võimalusena RequestServices saate .

See ei sisaldu näidiskoodis, kuid selle võib saada järgmiselt.

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

Andmebaasikonteksti loomine otse

Seda kasutatakse ka konsoolides ja töölauarakendustes. Seda meetodit saate kasutada ilma probleemideta. See ei ole soovitatav, sest tehingute ulatus kipub olema ebaselge veebirakendustes, kus samaaegne juurdepääs on tõenäoline. Eelkõige ei pruugi olla võimalik ajakohastusi taotluse alusel tagasi pöörata.

Kui pääsete andmebaasile sel viisil juurde, DbContext kasutate selle tuletamiseks tehnikat .

Esmalt Startup muutke . 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 Looge ühenduse TestDatabaseDbContextEx stringist appsettings.json tuletatud klass ja seadke see. Kui saate seada ühendusstringi, võite kasutada mõnda muud meetodit, näiteks selle läbimist konstruktori kaudu.

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

Kui soovite andmebaasile juurde pääseda, looge ja kasutage tuletatud klasside eksemplare.

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