ASP.NET databázy pomocou rámcového jadra subjektu v základnom

Dátum vytvorenia strany :

Životné prostredie

Vizuálne štúdio
  • Visual Studio 2019
ASP.NET jadro
  • 3.1 (MVC, Britva strana)
SQL Server
  • Expresný rok 2019

Najprv

Tieto tipy ASP.NET kroky na použitie Entity Framework Core pomocou prístupu Nasledujúce jadro.

Vytvorenie databázy pomocou entity Framework Core a tak ďalej nie je hlavným zameraním týchto tipov, takže nebudeme zachytáť podrobnosti. Môžu ASP.NET používať rovnakým spôsobom mimo Core.

Tentoraz sql server je nainštalovaný na inom serveri a pripojený overením servera SQL Server. Jediný rozdiel od overovania systému Windows používaného počas lokálnej inštalácie je reťazec pripojenia a v programe nie je žiadny rozdiel.

Vytvorenie tabuľky databázy

Tieto tipy používa SQL Server. Nainštalujte SQL Server v lokálnom prostredí alebo na akomkoľvek serveri.

Ak nemáte databázu na testovanie, vytvorte databázu.

Ak vytvárate v SQL, ako napríklad nasledovné, zmeňte cestu k verzii servera SQL Server a názov databázy tak, aby vyhovovali vášmu prostrediu.

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

Vytvorte tabuľku na testovanie. Nastavte hlavný kľúč pre aktualizácie a odstránenia.

Ak ho chcete vytvoriť 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

Pridajte záznam na zobrazenie.

Ak ho chcete pridať 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 subjektu, ktorý je k dispozícii v základnom

Táto položka je spoločná pre stránky MVC aj Razor.

Inštalácia balíka rámcového jadra subjektu

Po vytvorení projektu získajte balík od nuGet, aby ste mohli najprv použiť Entity Framework Core. MVC je príklad, ale operácia je rovnaká na britva stránky.

Kliknite pravým tlačidlom myši na položku Závislosti z projektu a vyberte položku Spravovať balíky NuGet.

Ak je na karte vybratá možnosť Prehľadávať, do vyhľadávacieho poľa zadajte výraz EntityFrameworkCore. Balíky entity Framework Core sa zobrazia v zozname.

Od tejto doby, budem používať SQL Server, takže nainštalujem nasledujúce balíky.

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

Nainštalume Microsoft.EntityFrameworkCore ako príklad, takže nainštalujte aj ďalšie dve.

Vyberte, čo chcete nainštalovať, a potom kliknite na tlačidlo Inštalovať. Verzia vyberie najnovší stabilizátor.

Dialógové okno je v podstate v poriadku kliknúť na tlačidlo OK.

Nainštalujte aj ďalšie dve.

Myslím si, že balík je takýto.

Vytvorenie modelu (programu) z konfigurácie tabuľky databázy

Ak chcete načítať alebo aktualizovať údaje z databázy v rámcovom jadre entity, Zvyčajne je potrebné vytvoriť program, ktorý je modelom založeným na konfigurácii tabuľky. Tento model sa nazýva aj entita aliasu.

Keď vytvoríte model, najprv kód, techniku na vytváranie tabuliek v databáze z modelu (programu) alebo K dispozícii je najprv databáza, ktorá je technikou na vytváranie modelov (programov) z tabuliek. Tu je jednoduchý prvý spôsob, ako naprogramovať databázu z tabuľky.

Mimochodom, tieto kroky sú ASP.NET na Jadro, takže ich môžete vytvoriť v konzole alebo počítačovej aplikácii rovnakým spôsobom.

Najprv zostavte projekt raz, aby ste sa uistili, že neexistujú žiadne chyby. Ak sa vyskytne chyba, model sa nedá vytvoriť. Ak ste už overili, že sa nevykonali žiadne chyby, nemusíte ho stavať.

Z Visual Studio, otvorte konzolu Package Manager. V opačnom prípade ho môžete otvoriť z nástrojov, NuGet Package Manager a Package Manager konzoly v ponuke.

Zobrazí sa okno podobné nižšie, preto sa uistite, že predvolený projekt v pravom hornom rohu je projekt, ktorý chcete modelovať. (Ak máte viacero projektov, musíte byť opatrní)

Do vstupného poľa zadajte nasledujúci text: Parametre sa líšia v závislosti od prostredia, preto ich včas zmeňte na nasledujúci popis. (najmä tam, kde je to ***** najmä)

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

Názov -Provider parametra, za ktorým nasleduje hodnota tohto parametra, je delený, napríklad na čele každého názvu.

Príklad parametra popisu parametra
Poskytovateľa Opravené v Microsoft.EntityFrameworkCore.SqlServer SQL Serveri. Microsoft.EntityFrameworkCore.SqlServer
Pripojenie Reťazec pripojenia na pripojenie k databáze. Reťazce pripojenia môžu byť použité v iných aplikáciách, takže prosím napíšte, čo zadáte podľa reťazca pripojenia kineki. K dispozícii je overovanie systému Windows aj overovanie na serveri SQL Server. Mimochodom, používa sa len dočasne na vytvorenie modelu, takže po publikovaní aplikácie pre tento reťazec pripojenia nemusíte vedieť o zabezpečení. Dajte si pozor na útek, ak máte symbol v hesli. "Zdroj údajov = Názov_servera\SQLEXPRESS;Databáza = TestDatabase;id používateľa = meno používateľa; heslo = * * * * "
F Vynútiť prepísanie aj v prípade, že už existuje program. <Nie >
OutputDir (Vyduť Cesta k priečinku, na ktorý sa kód vynáša. Relatívna cesta z priečinka projektu Modely\Databáza
Kontexte Názov kontextovej triedy pri používaní rámca entity TestDatabaseDbContext
PoužiťDatabaseNames Ak je zadané, názov tabuľky databázy sa zmení na názov triedy tak, ako je. V opačnom prípade sa prípad a viacnásobná forma názvu triedy entity upravia podľa pravidiel. <Nie >
Poznámky k údajom Ak je zadané, typ stĺpca automaticky pripojí atribút DataAnnotation ku každej vlastnosti. Je to trochu užitočné, ak chcete automaticky skontrolovať vstup podľa typu databázy. <Nie >

Stlačením klávesu Enter na jeho spustenie sa kód automaticky vygeneruje nasledovne:

Kód modelu pre tabuľku Používateľ je nasledovný:

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

Mimochodom, upozornenie sa zobrazí, pretože reťazec pripojenia je uvedený ako je v kóde generované kontextovej triedy. Uistite sa, OnConfiguring že odstrániť metódy v tomto kontexte triedy po kód je generovaný.

Registrácia reťazcov pripojenia

Toto ASP.NET spracovanie špecifické pre jadro. (Ak ho prispôsobíte, môžete ho použiť v iných aplikáciách .NET Core, ASP.NET môžete ho predvolene spracovať pre Core.)

Reťazec pripojenia zadaný v konzole Správcu balíkov sa použil iba na generovanie modelu.

Reťazec pripojenia na pripojenie k databáze ako webovej aplikácii je uvedený v súbore appsettings.json. Ak chcete zmeniť cieľ databázy, ku ktorej sa chcete pripojiť pre každú zostavu alebo publikáciu, môžete použiť nastavenia. Môže byť tiež rozvetvený spoločnosťou Development.json atď.

Okrem toho, pretože reťazec pripojenia sa tu používa ako operácia, urobme opatrenia, ako napríklad urobiť používateľa pripojenia vyhradeným používateľom s ohľadom na bezpečnosť atď.

Ak nastavíte na appsettings.json, vytvorte ConnectionStrings sekcia v koreňovej časti (objekt, nie presne sekcia). Vytvorte v ňom množinu kľúčov a hodnôt. Názov kľúča môže byť čokoľvek, ale bude použitý neskôr. Hodnota určuje reťazec pripojenia.

{
  // 

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

Sprístupniť rámcové jadro entity pre programy

Toto ASP.NET spracovanie špecifické pre jadro. (Ak ho prispôsobíte, môžete ho použiť v iných aplikáciách .NET Core, ASP.NET môžete ho predvolene spracovať pre Core.)

ASP.NET Core má každá inštancia čas prežitia, ktorý sa líši od konzol a počítačových aplikácií. Napríklad "Od času, keď je webová služba spustená až do jej zastavenej" alebo "od času, keď je požiadavka prijatá, až kým sa odpoveď nevráti". ASP.NET Core, ktorý je možné umiestniť do Jadra, určuje ServiceLifetime.Scoped štandardne. Ak nie je žiadny špeciálny dôvod, môžete zostať týmto spôsobom.

Ak chcete programu povoliť prístup k kontextu databázy, pridajte Startup.ConfigureServices ho do :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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 typ metódy určuje kontextovú triedu, ktorú ste vytvorili.

options.UseSqlServer Metóda naznačuje, že sql server sa používa.

Configuration.GetConnectionString("TestDatabaseDbContext") určuje názov kľúča zaregistrovaný na appsettings.json.

ASP.NET prípade použitia v Core MVC

ASP.NET niekoľko spôsobov, ako používať entity Framework Core v Core MVC.

Pridanie di (vložka závislosti) do ovládača

Registráciou .cs services.AddDbContext pri spustení.cs TestDatabaseDbContext Môže byť vložený do ovládača.

Príkladom DI HomeController je, že konštruktér má ILogger<HomeController> logger argument. Toto pridáva DI. Môžete vložiť TestDatabaseDbContext rovnakým spôsobom.

Ak HomeController chcete pridať do existujúceho , vyzerá to takto: Samozrejme, môže byť pridaný k iným kontrolórom.

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

Potom môžete získať prístup k databáze pomocou inštancie prijatého kontextu v každej akcii.

Použitie prípadov

Nasledujúci kód je kód, ktorý spracováva zoznam používateľov a nové registrácie. Odteraz ASP.NET jadrom bude rámcové jadro subjektu kódom pre každého, takže nebudem podrobne vysvetľovať.

Model vytvorený rámcovým jadrom subjektu sa stále môže použiť ako model akcií. Môžete tiež vytvoriť samostatný model a zabaliť a použiť model Entity Framework Core.

Kontext sa tiež automaticky zahodí, keď sa skončí požiadavka používateľa.

Domácicontroller.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));
  }

  // ここまで追加

  // 省略
}

Keďže je problematické vytvoriť obrazovku manuálne, obrazovka so zoznamom sa automaticky generuje lešením.

Automaticky Views/Home/List.cshtml generované je nasledovné:

@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 Pridajte prepojenie na prechod obrazovky do zoznamu.

<!-- 省略 -->

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

Automaticky sa generuje aj obrazovka registrácie používateľa.

Automaticky Views/Home/Create.cshtml generované je nasledovné: Je ťažké ho používať tak, ako je, takže som 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");}
}

Bežte a potvrďte to. Mimochodom, neexistujú žiadne bezpečnostné opatrenia, ako je registrácia hesla, takže pri prevádzke ASP.NET metód registrácie jadra a databázy.

Samozrejme, odráža sa to v databáze.

Tieto tipy nevytvárajú úpravy ani odstránenia, takže môžete použiť úpravy na správnom | Podrobnosti | Odstrániť" tiež spôsobuje chybu. Môžete ho vytvoriť rovnakým spôsobom ako vytvoriť, takže to skúste. Uvedené tri procesy boli tiež pridané do vzorového kódu.

Získať kontext databázy z RequestServices

Pridanie di do konštruktora radiča môže byť trochu ťažkopádne, pretože ho musíte pridať do všetkých ovládačov, ktoré potrebujete. Prípadne môžete RequestServices získať z .

Nie je zahrnutý v kóde vzorky, ale je možné ho získať nasledovne.

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

Priame vytvorenie kontextu databázy

Používa sa aj v konzolách a počítačových aplikáciách. Túto metódu môžete použiť bez problémov. Neodporúča sa, pretože rozsah transakcií má tendenciu byť nejednoznačný vo webových aplikáciách, kde je pravdepodobné, že dôjde k simultánnemu prístupu. Aktualizácie sa predovšetkým nemusia dať vrátiť späť na základe požiadavky.

Ak pristupujete k databáze týmto spôsobom, DbContext budete používať techniku odvodiť .

Najprv Startup upravte, aby sa s ním Configuration static pracovalo.

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

  // 省略
}

TestDatabaseDbContext Vytvorte TestDatabaseDbContextEx triedu odvodenú z a nastavte reťazec pripojenia appsettings.json. Ak môžete nastaviť reťazec pripojenia, môžete použiť inú metódu, napríklad jej odovzdanie konštruktérom.

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

Ak chcete získať prístup k databáze, generovať a používať inštancie odvodených tried.

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

ASP.NET napríklad na stránke Core Razor

ASP.NET niekoľko spôsobov, ako používať jadro rámca entity na stránke Core Razor.

Pridanie di (vloženie závislosti) do modelu strany

Registráciou .cs services.AddDbContext pri spustení.cs TestDatabaseDbContext Môže byť vložený do modelu strany.

Príkladom DI IndexModel je, že konštruktér má ILogger<IndexModel> logger argument. Toto pridáva DI. Môžete vložiť TestDatabaseDbContext rovnakým spôsobom.

Ak IndexModel chcete pridať do existujúceho , vyzerá to takto: Samozrejme, môže byť pridaný do iných modelov strán.

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

Potom môžete získať prístup k databáze pomocou inštancie kontextu, ktorý ste dostali v každom procese.

Použitie prípadov

Nasledujúci kód je kód, ktorý spracováva zoznam používateľov a nové registrácie. Obe ASP.NET Core a Entity Framework Core budú kódom, takže nebudem zachytáť detaily. Kontext sa tiež automaticky zahodí, keď sa skončí požiadavka používateľa.

Vytvorte model strany pre obrazovku zoznamu.

List.cshtml.cs takto:

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 vytvorený nasledovne:

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

Pridajte ho do Index.cshtml, aby ste mohli prejsť na stránku Zoznam.

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

Vytvorte aj obrazovku registrácie používateľa.

Vytvoriť.cshtml.cs kód takto:

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>

Bežte a potvrďte to. Mimochodom, neexistujú žiadne bezpečnostné opatrenia, ako je registrácia hesla, takže pri prevádzke ASP.NET metód registrácie jadra a databázy.

Samozrejme, odráža sa to v databáze.

Nevytvoril som žiadne úpravy ani odstránenia, takže nechcem upravovať | Podrobnosti | Odstrániť" tiež spôsobuje chybu. Môžete ho vytvoriť rovnakým spôsobom ako vytvoriť, takže to skúste. Uvedené tri procesy boli tiež pridané do vzorového kódu.

Získať kontext databázy z RequestServices

Pridanie di do konštruktora modelu stránky je trochu ťažkopádne, pretože ho musíte pridať do všetkých modelov straniek, ktoré potrebujete. Prípadne môžete RequestServices získať z .

Nie je zahrnutý v kóde vzorky, ale je možné ho získať nasledovne.

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

Priame vytvorenie kontextu databázy

Používa sa aj v konzolách a počítačových aplikáciách. Túto metódu môžete použiť bez problémov. Neodporúča sa, pretože rozsah transakcií má tendenciu byť nejednoznačný vo webových aplikáciách, kde je pravdepodobné, že dôjde k simultánnemu prístupu. Aktualizácie sa predovšetkým nemusia dať vrátiť späť na základe požiadavky.

Ak pristupujete k databáze týmto spôsobom, DbContext budete používať techniku odvodiť .

Najprv Startup upravte, aby sa s ním Configuration static pracovalo.

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

  // 省略
}

TestDatabaseDbContext Vytvorte TestDatabaseDbContextEx triedu odvodenú z a nastavte reťazec pripojenia appsettings.json. Ak môžete nastaviť reťazec pripojenia, môžete použiť inú metódu, napríklad jej odovzdanie konštruktérom.

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

Ak chcete získať prístup k databáze, generovať a používať inštancie odvodených tried.

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