duomenų bazių ASP.NET naudojant "Entity Framework Core" pagrindiniame

Puslapio sukūrimo data :

Aplinkos

Vizualinė studija
  • Vizualinė studija 2019
ASP.NET branduolys
  • 3.1 (MVC, Skustuvo puslapis)
SQL serveris
  • 2019 m. Express

Iš pradžių

Šie patarimai ASP.NET veiksmus, kaip naudoti objekto sistemos branduolį naudojant metodą "Following Core".

Duomenų bazės kūrimas naudojant "Entity Framework Core" ir t. t. nėra pagrindinis šių patarimų akcentas, todėl nesileisime į išsamią informaciją. Jie ASP.NET naudojami taip pat už Core ribų.

Šį kartą SQL serveris įdiegiamas kitame serveryje ir prijungiamas SQL serverio autentifikavimu. Vienintelis skirtumas nuo "Windows" autentifikavimo, naudojamo vietinio diegimo metu, yra jungimosi eilutė, o programoje nėra jokio skirtumo.

Duomenų bazės lentelės kūrimas

Šie patarimai naudoja SQL serverį. Įdiekite SQL serverį vietinėje aplinkoje arba bet kuriame serveryje.

Jei neturite tikrinti skirtos duomenų bazės, sukurkite duomenų bazę.

Jei kuriate SQL, pvz., toliau, pakeiskite SQL serverio versijos kelią ir duomenų bazės pavadinimą, kad jie atitiktų jūsų aplinką.

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

Sukurkite tikrinimo lentelę. Nustatykite pirminį naujinimų ir naikinimų raktą.

Jei norite jį sukurti 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

Įtraukite įrašą rodyti.

Jei norite įtraukti jį į 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 subjekto sistema, prieinama "Core"

Šis elementas yra bendras tiek MVC, tiek Skustuvo puslapiams.

Objekto sistemos branduolio paketo diegimas

Sukūrę projektą, gaukite paketą iš "NuGet", kad pirmiausia galėtumėte naudoti "Entity Framework Core". MVC yra pavyzdys, tačiau operacija yra tokia pati skustuvo puslapiuose.

Dešiniuoju pelės mygtuku spustelėkite Projekto priklausomybės ir pasirinkite Tvarkyti NuGet paketus.

Skirtuke pasirinkus Naršyti, ieškos lauke įveskite EntityFrameworkCore. Sąraše rodomi su objektų sistemos branduoliu susiję paketai.

Nuo to laiko naudosiu SQL serverį, todėl įdiegsiu šiuos paketus.

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

Įdiekime Microsoft.EntityFrameworkCore kaip pavyzdį, todėl įdiekite ir kitus du.

Pasirinkite, ką norite įdiegti, tada spustelėkite diegimo mygtuką. Versija pasirenka naujausią stabilizatorių.

Dialogas yra iš esmės gerai, kad spustelėkite Gerai.

Įdiekite kitus du taip pat.

Manau, kad paketas yra toks.

Modelio (programos) kūrimas iš duomenų bazės lentelės konfigūracijos

Jei norite nuskaityti arba atnaujinti duomenis iš duomenų bazės objektų sistemos branduolyje, Paprastai reikia sukurti programą, kuri yra modelis pagal lentelės konfigūraciją. Šis modelis taip pat vadinamas pseudonimo objektu.

Kai kuriate modelį, kodą pirmiausia, lentelių kūrimo duomenų bazėje iš modelio (programos) techniką, arba Pirmiausia yra duomenų bazė, kuri yra modelių (programų) kūrimo iš lentelių technika. Štai paprastas duomenų bazės pirmasis būdas automatiškai programuoti iš lentelės.

Beje, šie veiksmai yra ASP.NET į "The Core", todėl galite juos sukurti konsolėje arba darbalaukio programoje tokiu pačiu būdu.

Pirma, sukurkite projektą vieną kartą, kad įsitikintumėte, jog nėra klaidų. Jei įvyko klaida, modelio sukurti negalima. Jums nereikia jo statyti, jei jau patvirtinote, kad nėra klaidų.

"Visual Studio" atidarykite "Package Manager" konsolę. Kitu atveju galite jį atidaryti iš meniu įrankių, "NuGet Package Manager" ir "Package Manager" konsolių.

Pamatysite langą, panašų į toliau pateiktą, todėl įsitikinkite, kad numatytasis projektas viršutiniame dešiniajame krašte yra projektas, kurį norite modeliuoti. (Turite būti atsargūs, jei turite kelis projektus)

Įvesties lauke įveskite šį tekstą: Parametrai skiriasi priklausomai nuo aplinkos, todėl prašome juos laiku pakeisti į šį aprašymą. (ypač ten, kur jis ***** ypač)

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

Brūkšnelis, -Provider pvz., kiekvieno pavadinimo galvoje, yra parametro pavadinimas, po kurio eina to parametro reikšmė.

Parametro aprašo parametro pavyzdys
Teikėjas Fiksuotas Microsoft.EntityFrameworkCore.SqlServer SQL serveryje. Microsoft.EntityFrameworkCore.SqlServer
Ryšį Jungimosi eilutė, skirta prisijungti prie duomenų bazės. Jungimosi eilutės gali būti naudojamos kitose bendrose programose, todėl parašykite tai, ką nurodote pagal jungimosi eilutę kineki. Galimas "Windows" autentifikavimas ir SQL serverio autentifikavimas. Beje, jis naudojamas tik laikinai kuriant modelį, todėl jums nereikia žinoti apie saugumą po to, kai programa bus paskelbta šiai jungimosi eilutei. Saugokitės pabėgti, jei turite simbolį savo slaptažodį. "Duomenų šaltinis=ServerName\SQLEXPRESS;Duomenų bazė=TestDatabase;vartotojo id=Vartotojo vardas;slaptažodis=**********"
F Priverstinis perrašymas, net jei jau yra programa. <Ne >
IšvestisDir Aplanko maršrutas, į kurį išvestas kodas. Santykinis maršrutas iš projekto aplanko Modeliai\Duomenų bazė
Kontekste Konteksto klasės pavadinimas naudojant objektų sistemą TestDatabaseDbContext
UseDatabaseNames Jei nurodyta, duomenų bazės lentelės pavadinimas tampa klasės pavadinimu toks, koks yra. Kitu atveju atvejis ir sudėtin objekto klasės pavadinimo forma koreguojami pagal taisykles. <Ne >
DataAnnotations Jei nurodyta, stulpelio tipas automatiškai pridedamas prie kiekvienos ypatybės atributo DataAnnotation. Tai šiek tiek naudinga, jei norite automatiškai patikrinti įvestį pagal duomenų bazės tipą. <Ne >

Paspaudus Enter, kad jį paleistumėte, jis automatiškai sugeneruos kodą taip:

Vartotojo lentelės modelio kodas yra toks:

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

Beje, įspėjimas rodomas, nes jungimosi eilutė pateikiama tokia, kokia yra sugeneruotos konteksto klasės kode. Sugeneravę kodą, būtinai panaikinkite OnConfiguring šios konteksto klasės metodus.

Registruoti jungimosi eilutes

Tai ASP.NET konkretaus pagrindinio apdorojimo. (Jei jį tinkinsite, galėsite jį naudoti kitose .NET Core programose, bet ASP.NET pagal numatytuosius nustatymus galite tvarkyti jį su Core.)

Paketo tvarkytuvo konsolėje nurodyta jungimosi eilutė buvo naudojama tik modeliui generuoti.

Jungimosi eilutė, skirta prisijungti prie duomenų bazės kaip žiniatinklio programos, pateikiama appsettings.json. Jei norite pakeisti duomenų bazės paskirties vietą, prie kurios norite prisijungti kiekvienai komponavimo versijai ar leidiniui, galite naudoti programėlių nustatymus. Jis taip pat gali būti šakotas Development.json ir tt

Be to, kadangi jungimosi eilutė čia naudojama kaip operacija, imkimės tokių priemonių kaip ryšio vartotojo paveikimas, atsižvelgiant į saugumą ir pan.

Jei nustatysite appsettings.json, šakninėje sekcijoje sukurkite skyrių ConnectionStrings (objektas, ne visai sekcija). Sukurkite jame raktų ir reikšmių rinkinį. Rakto pavadinimas gali būti bet kas, tačiau jis bus naudojamas vėliau. Reikšmė nurodo jungimosi eilutę.

{
  // 

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

Padaryti objekto sistemos branduolį prieinamą programoms

Tai ASP.NET konkretaus pagrindinio apdorojimo. (Jei jį tinkinsite, galėsite jį naudoti kitose .NET Core programose, bet ASP.NET pagal numatytuosius nustatymus galite tvarkyti jį su Core.)

ASP.NET Core" kiekvienas egzempliorius turi išgyvenimo laiką, kuris skiriasi nuo konsolių ir darbalaukio programų. Pavyzdžiui, "Nuo to laiko, kai paleidžiama tinklo tarnyba, kol ji sustabdoma" arba "nuo užklausos gavimo iki atsakymo grąžinimo". ASP.NET sistemos branduolys, kurį galima įdėti į "The Core", ServiceLifetime.Scoped nurodo pagal numatytuosius nustatymus. Jei nėra ypatingos priežasties, galite likti tokiu būdu.

Jei norite leisti programai pasiekti duomenų bazės Startup.ConfigureServices kontekstą, įtraukite ją į :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Metodo tipo argumentas nurodo sukurtą konteksto klasę.

options.UseSqlServer Metodas nurodo, kad naudojamas SQL serveris.

Configuration.GetConnectionString("TestDatabaseDbContext") nurodo rakto pavadinimą, užregistruotą appsettings.json.

ASP.NET naudojimo atvejis Core MVC

ASP.NET yra keletas būdų, kaip naudoti subjekto sistemos branduolį pagrindinėje MVC.

Di (priklausomybės įterpimo) įtraukimas į valdiklį

Registruojant .cs services.AddDbContext metodą paleisties metu.cs TestDatabaseDbContext Jis gali būti įterptas į valdiklį.

DI pavyzdys HomeController yra tai, kad konstruktorius turi ILogger<HomeController> logger argumentą. Tai pridedama DI. Galite įterpti TestDatabaseDbContext tokiu pačiu būdu.

Jei HomeController norite įtraukti į esamą , atrodo taip: Žinoma, jis gali būti pridėtas prie kitų kontrolierių.

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

Tada galite pasiekti duomenų bazę naudodami kiekvieno veiksmo gauto konteksto egzempliorių.

Naudoti atvejus

Šis kodas yra kodas, kuris tvarko vartotojų sąrašą ir naujas registracijas. Nuo šiol ASP.NET branduolys, Subjekto pagrindų branduolys bus kodas kiekvienam, todėl aš ne išsamiai paaiškinti.

Objekto sistemos branduolio sugeneruotą modelį vis tiek galima naudoti kaip veiksmų modelį. Taip pat galite sukurti atskirą modelį ir vynioti bei naudoti objekto sistemos pagrindinį modelį.

Be to, kontekstas automatiškai atmetamas, kai vartotojo užklausa baigėsi.

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

  // ここまで追加

  // 省略
}

Kadangi sunku sukurti ekraną rankiniu būdu, sąrašo ekranas automatiškai generuojamas pastoliais.

Views/Home/List.cshtmlAutomatiškai sugeneruotas yra toks:

@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 Įtraukite saitą į ekrano perėjimą į sąrašą.

<!-- 省略 -->

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

Vartotojo registracijos ekranas taip pat generuojamas automatiškai.

Views/Home/Create.cshtmlAutomatiškai sugeneruotas yra toks: Sunku naudoti taip, kaip yra, todėl šiek tiek jį ištaisiau.

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

Paleiskite ir patvirtinkite. Beje, nėra jokių saugumo priemonių, tokių kaip slaptažodžio registracija, todėl dirbdami vadovaukitės ASP.NET Core" ir duomenų bazės registracijos metodais.

Žinoma, tai atsispindi duomenų bazėje.

Šie patarimai nesukuria redagavimų ar naikinimų, todėl galite naudoti redagavimą tinkamu | Išsami informacija | Naikinti" taip pat sukelia klaidą. Galite jį sukurti taip pat, kaip kurti, todėl išbandykite. Pirmiau minėti trys procesai taip pat buvo įtraukti į kodo pavyzdį.

Gauti duomenų bazės kontekstą iš RequestServices

Di pridėjimas prie valdiklio konstruktoriaus gali būti šiek tiek sudėtingas, nes turite jį pridėti prie visų reikiamų valdiklių. Arba RequestServices galite gauti iš .

Jis nėra įtrauktas į imties kodą, tačiau jį galima gauti taip.

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

Duomenų bazės konteksto kūrimas tiesiogiai

Jis taip pat naudojamas konsolėse ir darbalaukio programose. Šį metodą galite naudoti be jokių problemų. Tai nerekomenduojama, nes operacijų apimtis paprastai yra dviprasmiška žiniatinklio programose, kuriose gali atsirasti vienalaikė prieiga. Visų pirma, naujinimų gali nepavykti grąžinti į atskirą užklausą.

Jei prie duomenų bazės prisijungsite tokiu būdu, DbContext naudosite techniką, kad gautumėte .

Pirmiausia Startup modifikuokite darbą su 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 Sukurkite klasę, TestDatabaseDbContextEx gautą iš appsettings.json jungimosi eilutės, ir nustatykite ją. Jei galite nustatyti jungimosi eilutę, galite taikyti kitą metodą, pvz., perduoti ją per konstruktorių.

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

Jei norite pasiekti duomenų bazę, sugeneruokite ir naudokite išvestinių klasių egzempliorius.

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

ASP.NET pavyzdys "Core Razor" puslapyje

ASP.NET keliais būdais, kaip naudoti "Entity Framework Core" pagrindiniame skustuvo puslapyje.

Di (priklausomybės įterpimo) įtraukimas į puslapio modelį

Registruojant .cs services.AddDbContext metodą paleisties metu.cs TestDatabaseDbContext Jį galima įterpti į puslapio modelį.

DI pavyzdys IndexModel yra tai, kad konstruktorius turi ILogger<IndexModel> logger argumentą. Tai pridedama DI. Galite įterpti TestDatabaseDbContext tokiu pačiu būdu.

Jei IndexModel norite įtraukti į esamą , atrodo taip: Žinoma, jis gali būti pridėtas prie kitų puslapių modelių.

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

Tada galite pasiekti duomenų bazę naudodami konteksto, kurį gavote kiekviename procese, egzempliorių.

Naudoti atvejus

Šis kodas yra kodas, kuris tvarko vartotojų sąrašą ir naujas registracijas. Tiek "ASP.NET Core", tiek "Entity Framework Core" bus kodas, todėl nesileisiu į detales. Be to, kontekstas automatiškai atmetamas, kai vartotojo užklausa baigėsi.

Sukurkite sąrašo ekrano puslapio modelį.

List.cshtml.cs taip:

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 sukurtas taip:

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

Įtraukite jį į Index.cshtml, kad galėtumėte pereiti į sąrašo puslapį.

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

Taip pat sukurkite vartotojo registracijos ekraną.

Create.cshtml.cs kodas toks:

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

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

Paleiskite ir patvirtinkite. Beje, nėra jokių saugumo priemonių, tokių kaip slaptažodžio registracija, todėl dirbdami vadovaukitės ASP.NET Core" ir duomenų bazės registracijos metodais.

Žinoma, tai atsispindi duomenų bazėje.

Nesukūrė jokių redagavimų ar naikinimų, todėl nenoriu redaguoti, kad | Išsami informacija | Naikinti" taip pat sukelia klaidą. Galite jį sukurti taip pat, kaip kurti, todėl išbandykite. Pirmiau minėti trys procesai taip pat buvo įtraukti į kodo pavyzdį.

Gauti duomenų bazės kontekstą iš RequestServices

Pridėti di prie puslapio modelio konstruktorius yra šiek tiek sudėtinga, nes jūs turite įtraukti jį į visus puslapio modelius, jums reikia. Arba RequestServices galite gauti iš .

Jis nėra įtrauktas į imties kodą, tačiau jį galima gauti taip.

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

Duomenų bazės konteksto kūrimas tiesiogiai

Jis taip pat naudojamas konsolėse ir darbalaukio programose. Šį metodą galite naudoti be jokių problemų. Tai nerekomenduojama, nes operacijų apimtis paprastai yra dviprasmiška žiniatinklio programose, kuriose gali atsirasti vienalaikė prieiga. Visų pirma, naujinimų gali nepavykti grąžinti į atskirą užklausą.

Jei prie duomenų bazės prisijungsite tokiu būdu, DbContext naudosite techniką, kad gautumėte .

Pirmiausia Startup modifikuokite darbą su 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 Sukurkite klasę, TestDatabaseDbContextEx gautą iš appsettings.json jungimosi eilutės, ir nustatykite ją. Jei galite nustatyti jungimosi eilutę, galite taikyti kitą metodą, pvz., perduoti ją per konstruktorių.

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

Jei norite pasiekti duomenų bazę, sugeneruokite ir naudokite išvestinių klasių egzempliorius.

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