ASP.NET databáze pomocí jádra entity frameworku v jádru

Datum vytvoření stránky :

Prostředí

Visual Studio
  • Visual Studio 2019
ASP.NET jádro
  • 3.1 (MVC, stránka Razor)
SQL Server
  • Expresní rok 2019

Zpočátku

Tento tip ASP.NET kroky k použití jádra entity frameworku pomocí následujícího základního přístupu.

Vytvoření databáze pomocí entity Framework Core a tak dále nejsou hlavním zaměřením těchto tipů, takže nebudeme jít do podrobností. Jsou ASP.NET používány stejným způsobem mimo Jádro.

Tentokrát je sql server nainstalován na jiném serveru a připojen ověřováním SQL Serveru. Jediným rozdílem od ověřování systému Windows použitého během místní instalace je připojovací řetězec a v programu není žádný rozdíl.

Vytvoření databázové tabulky

Tyto tipy používají SQL Server. Sql Server nainstalujte do místního prostředí nebo na libovolný server.

Pokud k testování není k dispozici databáze, vytvořte databázi.

Pokud vytváříte v SQL, například následující, změňte cestu verze sql serveru a název databáze tak, aby vyhovoval vašemu prostředí.

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

Vytvořte tabulku pro testování. Nastavte primární klíč pro aktualizace a odstranění.

Pokud ji chcete vytvořit 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

Přidejte záznam pro zobrazení.

Pokud ji chcete přidat do 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 entity dostupné v jádru

Tato položka je společná pro stránky MVC i Razor.

Instalace balíčku jádra entity frameworku

Jakmile vytvoříte projekt, získejte balíček z NuGetu, abyste mohli nejprve použít Entity Framework Core. Příkladem je MVC, ale operace je stejná na žiletkových stránkách.

Klikněte pravým tlačítkem myši na Závislosti z projektu a vyberte Spravovat balíčky NuGet.

Pokud je na kartě vybraná možnost Procházet, zadejte do vyhledávacího pole EntityFrameworkCore. Balíčky související s jádrem entity se zobrazí v seznamu.

Od této doby budu používat SQL Server, takže nainstalujem následující balíčky.

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

Pojďme nainstalovat Microsoft.EntityFrameworkCore jako příklad, takže nainstalujte i další dva.

Vyberte, co chcete nainstalovat, a klikněte na tlačítko instalovat. Verze vybere nejnovější stabilizátor.

Dialog je v podstatě v pořádku kliknout ok.

Nainstalujte i další dva.

Myslím, že balíček je následující.

Vytvoření modelu (programu) z konfigurace databázové tabulky

Pokud chcete načíst nebo aktualizovat data z databáze v entitách Framework Core, Obvykle je třeba vytvořit program, který je modelem založeným na konfiguraci tabulky. Tento model se také nazývá entita aliasu.

Při vytváření modelu, nejprve kódu, techniky vytváření tabulek v databázi z modelu (programu) nebo Nejprve je k dispozici databáze, což je technika pro vytváření modelů (programů) z tabulek. Zde je jednoduchý způsob, jak automaticky programovat z tabulky.

Mimochodem, tyto kroky jsou ASP.NET do jádra, takže je můžete vytvořit v konzolové nebo desktopové aplikaci stejným způsobem.

Nejprve vytvořte projekt jednou, abyste se ujistili, že neexistují žádné chyby. Pokud dojde k chybě, model nelze vytvořit. Nemusíte ji zabudovávát, pokud jste již ověřili, že neexistují žádné chyby.

V sadě Visual Studio otevřete konzolu Správce balíčků. V opačném případě jej můžete otevřít z nástrojů, NuGet Package Manager a Package Manager konzol v nabídce.

Zobrazí se okno podobné tomu níže, takže se ujistěte, že výchozí projekt v pravém horním okně je projekt, který chcete modelovat. (Musíte být opatrní, pokud máte více projektů)

Do vstupního pole zadejte následující text: Parametry se liší v závislosti na prostředí, proto je prosím včas změňte na následující popis. (zejména tam, kde je to ***** zejména)

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

Pomlčky, -Provider například v čele každého názvu, je název parametru následovaný hodnotou tohoto parametru.

Příklad parametru Popis parametru
Zprostředkovatel Opraveno na Microsoft.EntityFrameworkCore.SqlServer serveru SQL Server. Microsoft.EntityFrameworkCore.SqlServer
Připojení Připojovací řetězec pro připojení k databázi. Připojovací řetězce lze použít v jiných aplikacích, takže prosím napište, co zadáte podle kineki připojovací řetězce. K dispozici je ověřování systému Windows i ověřování serveru SQL Server. Mimochodem, používá se pouze dočasně k vytvoření modelu, takže si musíte být vědomi zabezpečení po publikování aplikace pro tento připojovací řetězec. Dejte si pozor na útěk, pokud máte v hesle symbol. "Zdroj dat=Název_serveru\SQLEXPRESS;Databáze=TestDatabase;id uživatele=Uživatelské jméno;heslo=**********".
F Vynutit přepsání, i když již existuje program. <Ne >
OutputDir Cesta ke složce, do které je kód výstupem. Relativní cesta ze složky projektu Modely\Databáze
Kontextu Název místní třídy při použití entitního rámce TestDatabaseDbKontext
UseDatabaseNames Je-li zadáno, název tabulky databáze se stane názvem třídy tak, jak je. V opačném případě se případ a vícenásobná forma názvu třídy entity upraví podle pravidel. <Ne >
Datové poznámky Pokud je zadán, typ sloupce automaticky přichycuje atribut DataAnnotation ke každé vlastnosti. To je trochu užitečné, pokud chcete automaticky zkontrolovat vstup podle typu databáze. <Ne >

Stisknutím klávesy Enter ji spustíte a automaticky vygenerujete kód následujícím způsobem:

Kód modelu pro tabulku Uživatel je následující:

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

Mimochodem, upozornění se zobrazí, protože připojovací řetězec je uveden tak, jak je v kódu generované kontextové třídy. Ujistěte se, že OnConfiguring odstraníte metody v této kontextové třídě po vygenerování kódu.

Registrace připojovací řetězce

Jedná ASP.NET zpracování specifické pro jádro. (Pokud jej přizpůsobíte, můžete jej použít v jiných aplikacích .NET Core, ale ASP.NET můžete jej ve výchozím nastavení zpracovat pro Core.)

Připojovací řetězec zadaný v konzole Správce balíčků byl použit pouze ke generování modelu.

Připojovací řetězec pro připojení k databázi jako webové aplikaci je uveden v appsettings.json. Pokud chcete změnit cíl databáze, ke které se chcete připojit pro každé sestavení nebo publikaci, můžete použít appsettings. Může být také rozvětven společností Development.json atd.

Kromě toho, protože připojovací řetězec se zde používá jako operace, přijměme opatření, jako je vytvoření uživatele připojení vyhrazeným uživatelem s ohledem na zabezpečení atd.

Pokud ji nastavíte na appsettings.json, vytvořte oddíl ConnectionStrings v kořenové části (objekt, ne přesně oddíl). Vytvořte v něj sadu klíčů a hodnot. Název klíče může být cokoli, ale bude použit později. Hodnota určuje připojovací řetězec.

{
  // 

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

Zpřístupnění jádra entity frameworku programům

Jedná ASP.NET zpracování specifické pro jádro. (Pokud jej přizpůsobíte, můžete jej použít v jiných aplikacích .NET Core, ale ASP.NET můžete jej ve výchozím nastavení zpracovat pro Core.)

ASP.NET Core má každá instance dobu přežití, která se liší od konzolí a desktopových aplikací. Například "Od doby, kdy je webová služba spuštěna, dokud není zastavena" nebo "od doby, kdy je požadavek přijat, až do návratu odpovědi". ASP.NET core architektury, který lze umístit do jádra, ServiceLifetime.Scoped určuje ve výchozím nastavení. Pokud není žádný zvláštní důvod, můžete zůstat tímto způsobem.

Chcete-li programu povolit přístup k kontextu databáze, přidejte Startup.ConfigureServices jej do aplikace :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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 typu metody určuje kontextovou třídu, kterou jste vytvořili.

options.UseSqlServer Metoda označuje, že je použit sql server.

Configuration.GetConnectionString("TestDatabaseDbContext") určuje název klíče registrovaný u appsettings.json.

ASP.NET v jádru MVC

ASP.NET existuje několik způsobů, jak používat jádro entity frameworku v core MVC.

Přidání di (vložení závislostí) do řadiče

Registrací .cs services.AddDbContext při spuštění.cs TestDatabaseDbContext Může být vložen do regulátoru.

Příkladem DI HomeController je, že konstruktor má ILogger<HomeController> logger argument. To přidává DI. Můžete vložit TestDatabaseDbContext stejným způsobem.

HomeControllerChcete-li přidat k existujícímu , vypadá to tímto způsobem: Samozřejmě jej lze přidat do jiných řadičů.

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

K databázi pak můžete přistupovat pomocí instance přijatého kontextu v každé akci.

Případy použití

Následující kód je kód, který zpracovává výpis uživatelů a nové registrace. Od nynějška ASP.NET jádra entity frameworku kódem pro každého, takže nebudu podrobně vysvětlovat.

Model generovaný jádrem entity framework lze stále použít jako model pro akce. Můžete také vytvořit samostatný model a zabalit a použít model Entity Framework Core.

Kontext se také automaticky zahodí, když je požadavek uživatele u konce.

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

  // ここまで追加

  // 省略
}

Vzhledem k tomu, že ruční vytvoření obrazovky je obtížné, je obrazovka seznamu automaticky generována lešením.

Automaticky Views/Home/List.cshtml generované je následující:

@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 Přidejte odkaz na přechod obrazovky do seznamu.

<!-- 省略 -->

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

Automaticky se vygeneruje také obrazovka registrace uživatele.

Automaticky Views/Home/Create.cshtml generované je následující: Je to těžké použít tak, jak to je, takže jsem to trochu opravil.

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

Utíkej a potvrďte to. Mimochodem, neexistují žádná bezpečnostní opatření, jako je registrace hesla, takže při ASP.NET postupujte podle metod registrace jádra a databáze.

Samozřejmě se to odráží v databázi.

Tyto tipy nevytvářejí úpravy ani odstranění, takže můžete použít úpravy vpravo | Podrobnosti | Delete" také způsobí chybu. Můžete ji vytvořit stejným způsobem jako Create, takže to zkuste. Výše uvedené tři procesy byly také přidány do ukázkového kódu.

Získání kontextu databáze ze služby RequestServices

Přidání di do konstruktoru řadiče může být trochu těžkopádné, protože jej musíte přidat do všech řadičů, které potřebujete. Případně se RequestServices můžete dostat z .

Není součástí ukázkového kódu, ale lze jej získat následujícím způsobem.

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

Přímé vytvoření kontextu databáze

Používá se také v konzolích a desktopových aplikacích. Tuto metodu můžete použít bez problémů. Nedoporučuje se, protože rozsah transakcí bývá nejednoznačný ve webových aplikacích, kde je pravděpodobný současný přístup. Aktualizace nemusí být zejména možné vrátit zpět na základě jednotlivých žádostí.

Pokud přistupujete k databázi tímto DbContext způsobem, použijete k odvození .

Nejprve Startup upravte vlastnost tak, aby fungovala s 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 Vytvořte třídu TestDatabaseDbContextEx odvozenou z a nastavte připojovací řetězec appsettings.json. Pokud můžete nastavit připojovací řetězec, můžete použít jinou metodu, například jeho předání konstruktorem.

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

Pokud chcete přistupovat k databázi, vygenerujte a použijte instance odvozených tříd.

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

ASP.NET příklad na stránce Core Razor

ASP.NET několik způsobů použití jádra entity frameworku na stránce Core Razor.

Přidání di (vložení závislostí) do modelu stránky

Registrací .cs services.AddDbContext při spuštění.cs TestDatabaseDbContext Lze jej vložit do modelu stránky.

Příkladem DI IndexModel je, že konstruktor má ILogger<IndexModel> logger argument. To přidává DI. Můžete vložit TestDatabaseDbContext stejným způsobem.

IndexModelChcete-li přidat k existujícímu , vypadá to tímto způsobem: Samozřejmě jej lze přidat do jiných modelů stránek.

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

K databázi pak můžete přistupovat pomocí instance kontextu, který jste obdrželi v každém procesu.

Případy použití

Následující kód je kód, který zpracovává výpis uživatelů a nové registrace. Jak ASP.NET Core, tak Entity Framework Core budou kód, takže nebudu chodit do podrobností. Kontext se také automaticky zahodí, když je požadavek uživatele u konce.

Vytvořte model stránky pro obrazovku seznamu.

List.cshtml.cs následovně:

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 vytvořen takto:

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

Přidejte jej na index.cshtml, abyste mohli přejít na stránku Seznam.

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

Vytvořte také registrační obrazovku uživatele.

Create.cshtml.cs kód následujícím způsobem:

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

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

Utíkej a potvrďte to. Mimochodem, neexistují žádná bezpečnostní opatření, jako je registrace hesla, takže při ASP.NET postupujte podle metod registrace jádra a databáze.

Samozřejmě se to odráží v databázi.

Nevytvořil jsem žádné úpravy ani odstranění, takže nechci, aby byly úpravy | Podrobnosti | Delete" také způsobí chybu. Můžete ji vytvořit stejným způsobem jako Create, takže to zkuste. Výše uvedené tři procesy byly také přidány do ukázkového kódu.

Získání kontextu databáze ze služby RequestServices

Přidání di do konstruktoru modelu stránky je trochu těžkopádné, protože ho musíte přidat do všech modelů stránek, které potřebujete. Případně se RequestServices můžete dostat z .

Není součástí ukázkového kódu, ale lze jej získat následujícím způsobem.

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

Přímé vytvoření kontextu databáze

Používá se také v konzolích a desktopových aplikacích. Tuto metodu můžete použít bez problémů. Nedoporučuje se, protože rozsah transakcí bývá nejednoznačný ve webových aplikacích, kde je pravděpodobný současný přístup. Aktualizace nemusí být zejména možné vrátit zpět na základě jednotlivých žádostí.

Pokud přistupujete k databázi tímto DbContext způsobem, použijete k odvození .

Nejprve Startup upravte vlastnost tak, aby fungovala s 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 Vytvořte třídu TestDatabaseDbContextEx odvozenou z a nastavte připojovací řetězec appsettings.json. Pokud můžete nastavit připojovací řetězec, můžete použít jinou metodu, například jeho předání konstruktorem.

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

Pokud chcete přistupovat k databázi, vygenerujte a použijte instance odvozených tříd.

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