ASP.NET adatbázisok adatbázisok használata az Entity Framework Core in Core használatával

Oldal létrehozásának dátuma :

Környezet

Visual Stúdió
  • Visual Studio 2019
ASP.NET mag
  • 3.1 (MVC, Razor oldal)
SQL-kiszolgáló
  • 2019 Expressz

Először

Ez a ASP.NET az Entity Framework Core használatának lépéseit az alábbi Core megközelítéssel.

Adatbázis létrehozása az Entity Framework Core használatával stb. Úgy ASP.NET ugyanúgy használják a Core-n kívül.

Ezúttal az sql kiszolgáló egy másik kiszolgálóra van telepítve, és SQL Server hitelesítéssel csatlakozik. A helyi telepítés során használt Windows-hitelesítéstől csak a kapcsolati karakterlánc számít, és nincs különbség a programban.

Adatbázistábla létrehozása

Ez a tipp az SQL Servert használja. Telepítse az SQL Servert a helyi környezetben vagy bármely kiszolgálón.

Ha nincs tesztelésre használt adatbázisa, hozzon létre egy adatbázist.

Ha SQL-ben hoz létre, például a következőket, módosítsa az SQL Server verzió elérési útját és adatbázisnevét a környezetnek megfelelően.

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

Hozzon létre egy táblázatot tesztelésre. Állítsa be a frissítések és törlések elsődleges kulcsát.

Ha SQL-ben szeretné létrehozni:

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

Adjon hozzá egy megjelenítési rekordot.

Ha SQL-ben szeretné hozzáadni:

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 core-ban elérhető entitáskeret

Ez az elem gyakori mind az MVC, mind a Razor oldalakon.

Entitás framework core csomagtelepítése

Miután létrehozta a projektet, szerezze be a csomagot a NuGet-tól, hogy először az Entity Framework Core-t használhatja. MVC egy példa, de a művelet ugyanaz a borotva oldalakon.

Kattintson a jobb gombbal a projekt függőségek elemére, és válassza a NuGet-csomagok kezelése lehetőséget.

Ha a Tallózás beállítás ki van jelölve a lapon, írja be az EntityFrameworkCore parancsot a keresőmezőbe. Az entitás framework core-ral kapcsolatos csomagok megjelennek a listában.

Ettől az időponttól az SQL Servert fogom használni, ezért a következő csomagokat fogom telepíteni.

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

Telepítse például a Microsoft.EntityFrameworkCore-t, ezért telepítse a másik kettőt is.

Jelölje ki, hogy mit szeretne telepíteni, majd kattintson a telepítés gombra. A verzió kiválasztja a legújabb stabilizátort.

A párbeszéd alapvetően rendben van, hogy kattintson az OK gombra.

Telepítse a másik kettőt is.

Úgy gondolom, hogy a csomag a következő.

Modell (program) létrehozása adatbázistábla-konfigurációból

Ha adatokat szeretne lekérni vagy frissíteni az Entity Framework Core adatbázisából, Általában olyan programot kell létrehoznia, amely a táblakonfiguráción alapuló modell. Ezt a modellt alias entitásnak is nevezik.

Amikor létrehoz egy modellt, először kódot, egy technikát, amely táblákat hoz létre egy adatbázisban egy modellből (programból), vagy Először is van adatbázis, amely a táblákból származó modellek (programok) létrehozásának technikája. Íme egy egyszerű adatbázis-első módja annak, hogy automatikusan program egy táblából.

Egyébként ezek a lépések ASP.NET a Core-hoz, így ugyanúgy létrehozhatja őket a konzolon vagy az asztali alkalmazásban.

Először is, építse fel a projektet egyszer, hogy megbizonyosodjon arról, nincsenek hibák. Ha hiba lép fel, a modell nem hozható létre. Nem kell megépülni, ha már ellenőrizte, hogy nincsenek hibák.

A Visual Studio-ból nyissa meg a Csomagkezelő konzolt. Ellenkező esetben a menüben található eszközökből, a NuGet Package Managerből és a Csomagkezelő konzoljaiból is megnyithatja.

Az alábbi ablakhoz hasonló ablak jelenik meg, ezért győződjön meg arról, hogy az alapértelmezett projekt a jobb felső sarokban a modellen modellenként modellenként kívánt projekt. (Óvatosnak kell lennie, ha több projektje van)

A beviteli mezőbe írja be a következő szöveget: A paraméterek a környezettől függően változnak, ezért kérjük, időben módosítsa őket a következő leírásra. (különösen, ha ez ***** különösen)

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

A kötőjeles -Provider név, például az egyes elnevezések fejében a paraméter neve, amelyet a paraméter értéke követ.

Példa a paraméterleírás paraméterre
Szolgáltató Javítva Microsoft.EntityFrameworkCore.SqlServer az SQL Serverben. Microsoft.EntityFrameworkCore.SqlServer
Kapcsolat Kapcsolati karakterlánc az adatbázishoz való csatlakozáshoz. A kapcsolati karakterláncok más alkalmazásokban is használhatók, ezért kérjük, írja meg, amit a kapcsolati karakterláncnak megfelelően ad meg. Windows-hitelesítés és SQL Server-hitelesítés is rendelkezésre áll. By the way, ez csak ideiglenesen létrehozásához használt modell, így nem kell tisztában lennie a biztonság után az alkalmazás közzé ezt a kapcsolatot string. Óvakodj a meneküléstől, ha van egy szimbólum a jelszavadban. "Data Source=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=*********"
F Kényszerítse a felülírást, még akkor is, ha már van program. <Nem >
KimenetDir Az a mappa elérési útja, amelyhez a kód kimenete van. Relatív elérési út a projektmappából Modellek\Adatbázis
Összefüggésben Környezeti osztály neve az entitáskeret használatakor TestDatabaseDbContext
UseDatabaseNames használata Ha meg van adva, az adatbázis táblaneve lesz az osztály neve. Ellenkező esetben az eset és az entitásosztály nevének több formája a szabályoknak megfelelően módosul. <Nem >
DataAnnotációk Ha meg van adva, az oszloptípus automatikusan hozzáfűzi a DataAnnotation attribútumot az egyes tulajdonságokhoz. Ez egy kicsit hasznos, ha automatikusan ellenőrizni szeretné a bemenetet az adatbázis típusának megfelelően. <Nem >

Az Enter billentyű lenyomásával automatikusan kódot hoz létre az alábbiak szerint:

A Felhasználói tábla modellkódja a következő:

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

By the way, a figyelmeztetés jelenik meg, mert a kapcsolat karakterlánc szerepel, mint ez a kód a generált környezeti osztály. A kód létrehozása OnConfiguring után törölje a metódusokat ebben a környezetosztályban.

Kapcsolati karakterláncok regisztrálás

Ez ASP.NET magspecifikus feldolgozás. (Ha testreszabja, más .NET Core alkalmazásokban is használhatja, de ASP.NET a Core esetében alapértelmezés szerint kezelhető.)

A Csomagkezelő konzolban megadott kapcsolati karakterláncot csak a modell létrehozásához használták.

Az adatbázishoz webalkalmazásként való csatlakozás kapcsolati karakterlánca az appsettings.json listában található. Ha meg szeretné változtatni az adatbázis célhelyét, amelyhez minden egyes buildhez vagy kiadványhoz csatlakozni szeretne, használhatja az alkalmazásbeállításokat. Azt is elágazó Development.json, stb

Ezen túlmenően, mivel a kapcsolat string itt használják a művelet, tegyünk intézkedéseket, mint például, hogy a kapcsolat felhasználó egy dedikált felhasználó figyelembe véve a biztonság, stb

Ha appsettings.json értékre állította, hozzon létre egy ConnectionStrings szakaszt a gyökérszakaszban (objektum, nem éppen szakasz). Hozzon létre benne kulcsokat és értékeket. A kulcs neve bármi lehet, de később fogják használni. Az érték egy kapcsolati karakterláncot ad meg.

{
  // 

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

Entitás framework core elérhetővé teszi a programok számára

Ez ASP.NET magspecifikus feldolgozás. (Ha testreszabja, más .NET Core alkalmazásokban is használhatja, de ASP.NET a Core esetében alapértelmezés szerint kezelhető.)

ASP.NET Core esetében minden példánynak van túlélési ideje, ami különbözik a konzolok és az asztali alkalmazások. Például a "Webszolgáltatás elindult, amíg le nem áll" vagy "a kérés be nem érkezik a válasz visszaadásáig". ASP.NET Core keretrendszer, amely a Core-ban helyezhető el, ServiceLifetime.Scoped alapértelmezés szerint meghatározza. Ha nincs különleges oka, akkor maradjon így.

Ha engedélyezni szeretné, hogy a program hozzáférjen az adatbázis környezetéhez, adja Startup.ConfigureServices hozzá a következőhez:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> A metódus típus argumentuma a létrehozott környezeti osztályt határozza meg.

options.UseSqlServer A metódus azt jelzi, hogy sql kiszolgálót használ.

Configuration.GetConnectionString("TestDatabaseDbContext") megadja az appsettings.json alkalmazásban regisztrált kulcsnevet.

ASP.NET használati eset a Core MVC-ben

ASP.NET többféleképpen is használhatja az Entity Framework Core-t a Core MVC-ben.

Di (függőség beszúrása) hozzáadása vezérlőhöz

A módszer .cs services.AddDbContext indításkor történő regisztrálása.cs TestDatabaseDbContext Behelyezhető a vezérlőbe.

A di egyik HomeController példája, hogy a konstruktornak argumentuma ILogger<HomeController> logger van. Ezt a DI egészül ki. Ugyanúgy TestDatabaseDbContext beszúrhat.

Ha HomeController meglévőt szeretne hozzáadni, a következőképpen néz ki: Természetesen hozzá lehet adni más vezérlőkhöz.

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

Ezután az adatbázist az egyes műveletek fogadott környezetének példányával elérheti.

Esetek használata

A következő kód az a kód, amely kezeli a felhasználói listát és az új regisztrációkat. Mostantól a ASP.NET, Entity Framework Core lesz kód minden, így nem fogom megmagyarázni részletesen.

Az entitás Framework Core által létrehozott modell továbbra is használható modellként a műveletekhez. Külön modellt is létrehozhat, és körbefuttathatja és használhatja az Entity Framework Core modellt.

A környezet automatikusan elvetésre kerül, amikor a felhasználó kérése véget ért.

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

  // ここまで追加

  // 省略
}

Mivel zavaró manuálisan létrehozni a képernyőt, a listaképernyő automatikusan létrejön az állványzattal.

Az Views/Home/List.cshtml automatikusan generált a következő:

@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 Hivatkozás hozzáadása a listára való képernyőáttűnéshez.

<!-- 省略 -->

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

A felhasználói regisztrációs képernyő is automatikusan létrejön.

Az Views/Home/Create.cshtml automatikusan generált a következő: Nehéz használni, ahogy van, így már rögzített egy kicsit.

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

Fuss és erősítse meg. By the way, nincsenek biztonsági intézkedések, mint például a jelszó regisztráció, ezért kérjük, kövesse ASP.NET Core és adatbázis regisztrációs módszerek működéskor.

Természetesen ez tükröződik az adatbázisban.

Ez a tipp nem hoz létre módosításokat vagy törléseket, így a szerkesztést a jobb oldalon | Részletek | Törlés" is hibát okoz. Ugyanúgy hozhatja létre, mint a Létrehozás, ezért próbálja ki. A fenti három folyamat is bekerült a mintakódba.

Adatbázis-környezet bekérése a RequestServices szolgáltatásból

A di hozzáadása egy vezérlő konstruktorhoz egy kicsit nehézkes lehet, mert hozzá kell adnia az összes szükséges vezérlőhöz. Alternatív RequestServices megoldásként, akkor kap a .

Ez nem szerepel a mintakódban, de az alábbiak szerint szerezhető be.

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

Adatbáziskörnyezet közvetlen létrehozása

Konzolokban és asztali alkalmazásokban is használják. Ezt a módszert gond nélkül használhatja. Nem ajánlott, mert a tranzakciók hatóköre általában kétértelmű a webalkalmazásokban, ahol egyidejű hozzáférés valószínűsíthető. Előfordulhat, hogy a frissítések nem térhetnek vissza kérelemről kérésre.

Ha ily módon fér hozzá az DbContext adatbázishoz, akkor egy technikát fog használni a levezetéshez.

Először módosítsa Startup a munka 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 Hozzon létre egy osztály származtatott és állítsa be a TestDatabaseDbContextEx appsettings.json kapcsolat karakterlánc. Ha meg tud állítani egy kapcsolati karakterláncot, másik módszert is alkalmazhat, például egy konstruktoron keresztül.

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

Ha hozzá szeretne férni az adatbázishoz, hozzon létre és használjon példányokat a származtatott osztályokból.

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

ASP.NET példa a Core Razor oldalon

ASP.NET módon használhatja az Entity Framework Core-t egy Core Razor oldalon.

Di (függőség beszúrása) hozzáadása az oldalmodellhez

A módszer .cs services.AddDbContext indításkor történő regisztrálása.cs TestDatabaseDbContext Beilleszthető egy oldalmodellbe.

A di egyik IndexModel példája, hogy a konstruktornak argumentuma ILogger<IndexModel> logger van. Ezt a DI egészül ki. Ugyanúgy TestDatabaseDbContext beszúrhat.

Ha IndexModel meglévőt szeretne hozzáadni, a következőképpen néz ki: Természetesen hozzáadható más oldalmodellekhez.

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

Ezután az egyes folyamatokban kapott környezet példányával elérheti az adatbázist.

Esetek használata

A következő kód az a kód, amely kezeli a felhasználói listát és az új regisztrációkat. Mind ASP.NET Core, mind az Entity Framework Core kód lesz, így nem megyek bele a részletekbe. A környezet automatikusan elvetésre kerül, amikor a felhasználó kérése véget ért.

Oldalmodell létrehozása a listaképernyőhöz.

List.cshtml.cs az alábbiak szerint:

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

A List.cshtml az alábbiak szerint jön létre:

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

Adja hozzá az Index.cshtml fájlhoz, hogy áttérhet a Lista oldalra.

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

Hozzon létre egy felhasználói regisztrációs képernyőt is.

Create.cshtml.cs kód az alábbiak szerint:

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 az alábbiak szerint:

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

Fuss és erősítse meg. By the way, nincsenek biztonsági intézkedések, mint például a jelszó regisztráció, ezért kérjük, kövesse ASP.NET Core és adatbázis regisztrációs módszerek működéskor.

Természetesen ez tükröződik az adatbázisban.

Nem hoztam létre módosításokat vagy törléseket, ezért nem szeretnék szerkeszteni a | Részletek | Törlés" is hibát okoz. Ugyanúgy hozhatja létre, mint a Létrehozás, ezért próbálja ki. A fenti három folyamat is bekerült a mintakódba.

Adatbázis-környezet bekérése a RequestServices szolgáltatásból

Hozzáadása di egy oldal modell konstruktor egy kicsit nehézkes, mert hozzá kell adni, hogy az összes oldal modellek van szüksége. Alternatív RequestServices megoldásként, akkor kap a .

Ez nem szerepel a mintakódban, de az alábbiak szerint szerezhető be.

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

Adatbáziskörnyezet közvetlen létrehozása

Konzolokban és asztali alkalmazásokban is használják. Ezt a módszert gond nélkül használhatja. Nem ajánlott, mert a tranzakciók hatóköre általában kétértelmű a webalkalmazásokban, ahol egyidejű hozzáférés valószínűsíthető. Előfordulhat, hogy a frissítések nem térhetnek vissza kérelemről kérésre.

Ha ily módon fér hozzá az DbContext adatbázishoz, akkor egy technikát fog használni a levezetéshez.

Először módosítsa Startup a munka 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 Hozzon létre egy osztály származtatott és állítsa be a TestDatabaseDbContextEx appsettings.json kapcsolat karakterlánc. Ha meg tud állítani egy kapcsolati karakterláncot, másik módszert is alkalmazhat, például egy konstruktoron keresztül.

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

Ha hozzá szeretne férni az adatbázishoz, hozzon létre és használjon példányokat a származtatott osztályokból.

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