ASP.NET zbirk podatkov z uporabo okvirnega jedra entitete v jedru

Datum ustvarjanja strani :

Okolje

Vizualni studio
  • Vizualni studio 2019
ASP.NET Core
  • 3.1 (MVC, stran z britvicami)
STREŽNIK SQL
  • 2019 Express

Sprva

Ta nasvet ASP.NET korake za uporabo okvirnega jedra entitete s pristopom Naslednje jedro.

Ustvarjanje zbirke podatkov, uporaba Entity Framework Core in tako naprej niso glavni poudarek teh nasvetov, tako da ne bomo šli v podrobnosti. Uporabljali ASP.NET na enak način izven Coreja.

Tokrat je strežnik SQL nameščen na drugem strežniku in povezan s preverjanjem pristnosti strežnika SQL Server. Edina razlika od preverjanja pristnosti sistema Windows, ki se uporablja med lokalno namestitvijo, je niz povezave in ni razlike v programu.

Ustvarjanje tabele zbirke podatkov

Ta nasveti uporabljajo SQL Server. Namestite SQL Server v lokalnem okolju ali katerem koli strežniku.

Če nimate zbirke podatkov za testiranje, ustvarite zbirko podatkov.

Če ustvarjate v SQL, na primer v naslednjem, spremenite pot različice sql serverja in ime zbirke podatkov, da ustreza vašemu okolju.

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

Ustvarite tabelo za testiranje. Nastavite primarni ključ za posodobitve in brisanja.

Če ga želite ustvariti v 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

Dodajte zapis za prikaz.

Če ga želite dodati v 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 okvir subjekta, ki je na voljo v

Ta element je skupen tako za strani MVC kot britvice.

Namestitev paketa Entity Framework Core

Ko ustvarite projekt, preusmite paket iz programa NuGet, tako da lahko najprej uporabite okvirno jedro entitete. MVC je primer, vendar je operacija enaka na britvicah strani.

Z desno tipko miške kliknite Odvisnosti iz projekta in izberite Upravljanje paketov NuGet.

Z izbranim brskanjem na zavihku v iskalno polje vnesite EntityFrameworkCore. Paketi Entity Framework Core se prikažejo na seznamu.

Od tega časa, bom uporabil SQL Server, tako da bom namestiti naslednje pakete.

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

Namestimo Microsoft.EntityFrameworkCore kot primer, zato namestite tudi druga dva.

Izberite, kaj želite namestiti, in kliknite gumb za namestitev. Različica izbere najnovejši stabilizator.

Pogovorno okno je v redu, da kliknete ok.

Namestite tudi druga dva.

Mislim, da je paket naslednji.

Ustvarjanje modela (programa) iz konfiguracije tabele zbirke podatkov

Če želite pridobiti ali posodobiti podatke iz zbirke podatkov v Entity Framework Core, Običajno morate ustvariti program, ki je model, ki temelji na konfiguraciji tabele. Ta model se imenuje tudi entiteta vzdevka.

Ko najprej ustvarite model, kodo, tehniko za ustvarjanje tabel v zbirki podatkov iz modela (programa) ali Najprej obstaja baza podatkov, ki je tehnika za ustvarjanje modelov (programov) iz tabel. Tukaj je preprost način za samodejno programiranje iz tabele.

Mimogrede, ti koraki so ASP.NET core, tako da jih lahko ustvarite v konzoli ali namizni aplikaciji na enak način.

Najprej enkrat zgradite projekt, da se prepričate, da ni napak. Če je prišlo do napake, modela ni mogoče ustvariti. Ni vam ga treba zgraditi, če ste že preverili, da ni napak.

V visual studiu odprite konzolo Upravitelj paketov. V nasprotnem primeru ga lahko odprete iz orodji, NuGet Package Manager in Package Manager konzol v meniju.

Prikazano bo okno, podobno spodnjemu, zato se prepričajte, da je privzeti projekt v zgornjem desnem kotu projekt, ki ga želite modeliranje. (Morate biti previdni, če imate več projektov)

V polje za vnos vnesite to besedilo: Parametri se razlikujejo glede na okolje, zato jih pravočasno spremenite na naslednji opis. (še posebej tam, kjer je ***** še posebej)

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

Ime parametra je ime parametra, ki mu sledi vrednost tega parametra, na primer na glavi vsakega -Provider imena.

Primer
parametra Opis parametra
Ponudnik Popravljeno v Microsoft.EntityFrameworkCore.SqlServer strežniku SQL Server. Microsoft.EntityFrameworkCore.SqlServer
Povezavo Niz povezave za povezovanje z zbirko podatkov. Nize za povezavo lahko uporabljate v drugih aplikacijah, ki so skupne, zato napišite, kar določite v skladu z nizom povezave kineki. Na voljo sta preverjanje pristnosti sistema Windows in preverjanje pristnosti strežnika SQL Server. Mimogrede, le začasno se uporablja za ustvarjanje modela, zato se vam ni treba zavedati varnosti, potem ko je aplikacija objavljena za ta niz povezave. Pazite se pobega, če imate v gesla simbol. "Data Source=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=**********"
F Prisilite prepis, tudi če že obstaja program. <Ne >
Izhodnidir Pot mape, do katere je koda izhodna. Relativna pot iz mape projekta Modeli\Zbirka podatkov
Kontekstu Ime kontekstnega razreda pri uporabi okvira entitete TestDatabaseDbContext
UporabiDatabaseNames Če je določeno, ime tabele zbirke podatkov postane ime razreda, kot je. V nasprotnem primeru se primer in večkratna oblika imena razreda entitete prilagodita v skladu s pravili. <Ne >
DataAnnotations Če je določeno, vrsta stolpca samodejno pripiše atribut DataAnnotation vsaki lastnosti. To je nekoliko uporabno, če želite samodejno preveriti vhod glede na vrsto zbirke podatkov. <Ne >

Če pritisnete enter, da ga zaženete, samodejno ustvarite kodo, kot sledi:

Koda modela za tabelo »Uporabnik« je naslednja:

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

Mimogrede, opozorilo se prikaže, ker je niz povezave naveden kot v kodi generiranega kontekstnega razreda. Po generirani kodi se prepričajte, da izbrišete metode v tem OnConfiguring kontekstu.

Registracija nizov povezave

To ASP.NET obdelava, specifična za jedro. (Če ga prilagodite, ga lahko uporabljate v drugih programih .NET Core, vendar ASP.NET ga lahko obravnavate privzeto za Core.)

Niz povezave, določen v konzoli upravitelja paketov, je bil uporabljen samo za ustvarjanje modela.

Niz povezave za povezovanje z zbirko podatkov kot spletno aplikacijo je naveden v appsettings.json. Če želite spremeniti cilj zbirke podatkov za povezavo za vsako graditev ali publikacijo, lahko uporabite aplikacije. Lahko ga razveja tudi Development.json itd.

Poleg tega, ker se tukaj uporabljen niz povezave kot delovanje, sprejmemo ukrepe, kot so, da je uporabnik povezave namenski uporabnik v upoštevanju varnosti itd.

Če ga nastavite na appsettings.json, ustvarite odsek ConnectionStrings v korenski razdelek (predmet, ne ravno odsek). Ustvarite nabor ključev in vrednosti v tem. Ime ključa je lahko karkoli, vendar se bo uporabljalo kasneje. Vrednost določa niz povezave.

{
  // 

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

Dajte programom na voljo okvirno jedro entitete

To ASP.NET obdelava, specifična za jedro. (Če ga prilagodite, ga lahko uporabljate v drugih programih .NET Core, vendar ASP.NET ga lahko obravnavate privzeto za Core.)

ASP.NET Core ima vsak primerek čas preživetja, ki se razlikuje od konzol in namiznih aplikacij. Na primer, "Od takrat, ko je spletna storitev zagnana, dokler se ne ustavi" ali "od prejema zahteve, dokler se odgovor ne vrne". ASP.NET core, ki ga je mogoče vneti v Jedro, privzeto ServiceLifetime.Scoped določa. Če ni posebnega razloga, lahko tako ostaneš.

Če želite programu omogočiti dostop do konteksta zbirke podatkov, ga Startup.ConfigureServices dodajte v:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Argument vrste metode določa kontekstni razred, ki ste ga ustvarili.

options.UseSqlServer Metoda označuje, da se uporablja strežnik SQL.

Configuration.GetConnectionString("TestDatabaseDbContext") določa ime ključa, registrirano pri appsettings.json.

ASP.NET za uporabo v osnovnem MVC

ASP.NET je več načinov za uporabo okvirnega jedra entitete v jedru MVC.

Dodajanje di (vstavek odvisnosti) v krmilnik

Z registracijo .cs services.AddDbContext pri zagonu.cs TestDatabaseDbContext Lahko ga vstavite v krmilnik.

Primer DI je, da ima HomeController konstruktor ILogger<HomeController> logger argument. To je dodal DI. Lahko vstavite TestDatabaseDbContext na enak način.

Če želite HomeController dodati obstoječemu , je videti tako: Seveda se lahko doda tudi drugim kontrolorjem.

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

Do zbirke podatkov lahko dostopate tako, da v vsakem dejanju uporabite primerek prejetega konteksta.

Primeri uporabe

Naslednja koda je koda, ki obravnava seznam uporabnikov in nove registracije. Od zdaj naprej ASP.NET jedro Entity Framework Core bo koda za vsako, zato ne bom podrobno razložil.

Model entity Framework Core-generated se lahko še vedno uporablja kot model za dejanja. Ustvarite lahko tudi ločen model in zavijete in uporabite model Entity Framework Core.

Prav tako se kontekst samodejno zavrže, ko je zahteva uporabnika končana.

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

  // ここまで追加

  // 省略
}

Ker je težavno ročno ustvariti zaslon, se zaslon seznama samodejno ustvari z odlomki.

Samodejno Views/Home/List.cshtml ustvarjeno je naslednje:

@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 Dodajte povezavo do prehoda zaslona na seznam.

<!-- 省略 -->

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

Samodejno se ustvari tudi zaslon za registracijo uporabnika.

Samodejno Views/Home/Create.cshtml ustvarjeno je naslednje: Težko ga je uporabiti, kot je, zato sem ga malo popravil.

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

Teci in potrdi. Mimogrede, ni varnostnih ukrepov, kot je registracija gesla, zato upoštevajte ASP.NET core in metode registracije zbirke podatkov med delovanjem.

Seveda se odraža v bazi podatkov.

Ti nasveti ne ustvarjajo urejanja ali brisanja, zato lahko z urejanjem uporabite pravo | Podrobnosti | Brisanje" povzroči tudi napako. Ustvarite ga lahko na enak način kot Ustvari, zato poskusite. K vzorčni kodi so bili dodani tudi zgornji trije postopki.

Dobi kontekst zbirke podatkov iz storitve RequestServices

Dodajanje di konstruktorju krmilnika je lahko nekoliko oklevato, ker ga morate dodati vsem krmilnikom, ki jih potrebujete. Druga možnost je, da RequestServices lahko dobiš od .

Ni vključena v vzorčno kodo, vendar jo je mogoče pridobiti na naslednji način.

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

Neposredno ustvarjanje konteksta zbirke podatkov

Uporablja se tudi v konzolah in namiznih aplikacijah. To metodo lahko uporabite brez težav. Ni priporočljivo, ker je obseg transakcij običajno nedvoumen v spletnih aplikacijah, kjer se bo lahko pojavljal hkratni dostop. Posodobitev morda ne bo mogoče vrniti na podlagi zahteve po zahtevi.

Če dostopate do zbirke podatkov na ta način, boste uporabili tehniko za DbContext izpeljavo .

Najprej Startup spremenite delo z 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 Ustvarite razred, ki izhaja iz in nastavite niz povezave TestDatabaseDbContextEx appsettings.json. Če lahko nastavite niz povezave, lahko vzamete drug način, na primer, da ga prepeljete skozi konstruktorja.

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

Če želite dostopati do zbirke podatkov, ustvarite in uporabite primerke izpeljanih razredov.

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

ASP.NET primer na strani z jedrno britvico

ASP.NET več načinov za uporabo okvirnega jedra entitete na strani z jedrno britvico.

Dodajanje di (vstavljanje odvisnosti) v model strani

Z registracijo .cs services.AddDbContext pri zagonu.cs TestDatabaseDbContext Lahko ga vstavite v model strani.

Primer DI je, da ima IndexModel konstruktor ILogger<IndexModel> logger argument. To je dodal DI. Lahko vstavite TestDatabaseDbContext na enak način.

Če želite IndexModel dodati obstoječemu , je videti tako: Seveda se lahko doda tudi drugim modelom strani.

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

Do zbirke podatkov lahko dostopate tako, da uporabite primerek konteksta, ki ste ga prejeli v vsakem postopku.

Primeri uporabe

Naslednja koda je koda, ki obravnava seznam uporabnikov in nove registracije. Tako ASP.NET core in Entity Framework Core bo koda, tako da ne bom šel v podrobnosti. Prav tako se kontekst samodejno zavrže, ko je zahteva uporabnika končana.

Ustvarite model strani za zaslon seznama.

List.cshtml.cs kot sledi:

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 je ustvarjen na naslednji način:

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

Dodajte ga v Index.cshtml, tako da lahko preiščite stran Seznam.

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

Ustvarite tudi zaslon za registracijo uporabnika.

Ustvarite.cshtml.cs kodo, kot sledi:

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

Ustvari.cshtml, kot sledi:

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

Teci in potrdi. Mimogrede, ni varnostnih ukrepov, kot je registracija gesla, zato upoštevajte ASP.NET core in metode registracije zbirke podatkov med delovanjem.

Seveda se odraža v bazi podatkov.

Nisem ustvaril nobenih urejanj ali izbrisov, zato ne želim, da urejanje | Podrobnosti | Brisanje" povzroči tudi napako. Ustvarite ga lahko na enak način kot Ustvari, zato poskusite. K vzorčni kodi so bili dodani tudi zgornji trije postopki.

Dobi kontekst zbirke podatkov iz storitve RequestServices

Dodajanje di konstruktorju modela strani je nekoliko oteglo, ker ga morate dodati vsem modelom strani, ki jih potrebujete. Druga možnost je, da RequestServices lahko dobiš od .

Ni vključena v vzorčno kodo, vendar jo je mogoče pridobiti na naslednji način.

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

Neposredno ustvarjanje konteksta zbirke podatkov

Uporablja se tudi v konzolah in namiznih aplikacijah. To metodo lahko uporabite brez težav. Ni priporočljivo, ker je obseg transakcij običajno nedvoumen v spletnih aplikacijah, kjer se bo lahko pojavljal hkratni dostop. Posodobitev morda ne bo mogoče vrniti na podlagi zahteve po zahtevi.

Če dostopate do zbirke podatkov na ta način, boste uporabili tehniko za DbContext izpeljavo .

Najprej Startup spremenite delo z 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 Ustvarite razred, ki izhaja iz in nastavite niz povezave TestDatabaseDbContextEx appsettings.json. Če lahko nastavite niz povezave, lahko vzamete drug način, na primer, da ga prepeljete skozi konstruktorja.

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

Če želite dostopati do zbirke podatkov, ustvarite in uporabite primerke izpeljanih razredov.

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