ASP.NET bases de dades mitjançant l'ús del nucli del marc de treball de l'entitat al nucli

Data de creació de la pàgina :

Medi ambient

Estudi Visual
  • Estudi Visual 2019
Nucli ASP.NET
  • 3.1 (MVC, pàgina de la navalla)
Servidor de l'SQL
  • Exprés 2019

Al principi

Aquests consells ASP.NET passos per utilitzar el nucli del marc de treball de l'entitat mitjançant l'enfocament següent.

La creació d'una base de dades, utilitzant el nucli del framework d'entitats, no és el focus principal d'aquests consells, de manera que no entrarem en detalls. S'ASP.NET utilitzant de la mateixa manera fora de Core.

Aquesta vegada, l'SQL Server està instal·lat en un servidor diferent i connectat per l'autenticació de l'SQL Server. L'única diferència respecte a l'autenticació del Windows utilitzada durant una instal·lació local és la cadena de connexió, i no hi ha cap diferència en el programa.

Crear una taula de base de dades

Aquest consell utilitza l'SQL Server. Instal·leu l'SQL Server al vostre entorn local o a qualsevol servidor.

Si no teniu una base de dades per fer proves, creeu una base de dades.

Si esteu creant en SQL, com ara el següent, canvieu el camí de la versió de l'SQL Server i el nom de la base de dades perquè s'adapti al vostre entorn.

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

Crea una taula per fer proves. Definiu la clau primària per a les actualitzacions i les supressions.

Si voleu crear-lo en 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

Afegeix un registre per visualitzar-lo.

Si voleu afegir-lo a l'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 marc d'entitat disponible al nucli

Aquest element és comú a les pàgines MVC i Navalla.

Instal·lació de paquets del nucli del marc de treball de l'entitat

Un cop hàgiu creat el vostre projecte, obteniu el paquet de NuGet perquè pugueu utilitzar primer el nucli marc d'entitats. MVC és un exemple, però l'operació és la mateixa a les pàgines d'afaitar.

Feu clic amb el botó dret del ratolí a Dependències del projecte i seleccioneu Gestiona els paquets NuGet.

Amb Navega seleccionat des de la pestanya , escriviu EntityFrameworkCore al camp de cerca. Els paquets relacionats amb el nucli del framework de l'entitat apareixen a la llista.

A partir d'aquest moment, utilitzaré l'SQL Server, així que instal·laré els següents paquets.

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

Instal·lem el Microsoft.EntityFrameworkCore com a exemple, de manera que instal·leu els altres dos.

Seleccioneu el que voleu instal·lar i feu clic al botó d'instal·lació. La versió selecciona l'últim estabilitzador.

El diàleg està bàsicament bé per fer clic a D'acord.

Instal·leu també els altres dos.

Crec que el paquet és el següent.

Crear un model (programa) a partir d'una configuració de taula de base de dades

Si voleu recuperar o actualitzar dades d'una base de dades al nucli del marc de treball de l'entitat, Normalment heu de crear un programa que sigui un model basat en la configuració de la taula. Aquest model també s'anomena entitat d'àlies.

Quan creeu un model, primer codi, una tècnica per crear taules en una base de dades a partir d'un model (programa) o Hi ha primer una base de dades, que és una tècnica per crear models (programes) a partir de taules. Aquí hi ha una manera senzilla de programar automàticament des d'una taula.

Per cert, aquests passos són ASP.NET a The Core, de manera que podeu crear-los a la consola o a l'aplicació d'escriptori de la mateixa manera.

En primer lloc, creeu el projecte una vegada per assegurar-vos que no hi ha errors. Si hi ha un error, no es pot crear el model. No cal que l'hàgiu de construir si ja heu comprovat que no hi ha errors.

Des del Visual Studio, obriu la consola del gestor de paquets. En cas contrari, podeu obrir-lo des de les eines, nuGet Package Manager i consoles de Package Manager al menú.

Veureu una finestra similar a la de sota, així que assegureu-vos que el projecte per defecte a la part superior dreta és el projecte que voleu modelar. (Has d'anar amb compte si tens diversos projectes)

Al camp d'entrada, escriviu el text següent: Els paràmetres varien en funció de l'entorn, de manera que canvieu-los oportunament a la descripció següent. (especialment quan és ***** en particular)

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

Un partició de -Provider mots, com ara al capdavant de cada nom, és el nom del paràmetre, seguit del valor d'aquest paràmetre.

Exemple de paràmetre
de descripció del paràmetre
Proveïdor S'ha solucionat a Microsoft.EntityFrameworkCore.SqlServer l'SQL Server. Servidor Microsoft.EntityFrameworkCore.SqlServer
Connexió Cadena de connexió per connectar-se a la base de dades. Les cadenes de connexió es poden utilitzar en altres aplicacions en comú, de manera que escriviu el que especifiqueu segons la cadena de connexió kineki. Tant l'autenticació del Windows com l'autenticació de l'SQL Server estan disponibles. Per cert, només s'utilitza temporalment per crear un model, de manera que no cal estar atent a la seguretat després de publicar l'aplicació per a aquesta cadena de connexió. Aneu amb compte d'escapar si teniu un símbol a la contrasenya. "Origen de dades=NomServidor\SQLEXPRESS;Base de dades=ProvaDatabase;id d'usuari=Nom d'usuari;contrasenya=*******
F Força la sobreescriptura encara que ja hi hagi un programa. <No >
SortidaDir El camí de la carpeta a la qual surt el codi. Camí relatiu des de la carpeta del projecte Models\Base de dades
Context Nom de la classe de context quan s'utilitza el Marc d'entitats Textcontext de ProvaDatabaseDb
Noms de la base de dades d'UseData Si s'especifica, el nom de la taula de la base de dades es converteix en el nom de la classe tal com és. En cas contrari, el cas i la forma múltiple del nom de la classe d'entitat s'ajusten segons les regles. <No >
Anotacions de dades Si s'especifica, el tipus de columna afegeix automàticament l'atribut DataAnnotation a cada propietat. Això és una mica útil si voleu comprovar automàticament l' entrada segons el tipus de la base de dades. <No >

En prémer Retorn per executar-lo es generarà automàticament el codi de la següent manera:

El codi de model de la taula d'usuari és el següent:

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

Per cert, l'avís es mostra perquè la cadena de connexió apareix tal com es troba al codi de la classe de context generada. Assegureu-vos de suprimir OnConfiguring els mètodes d'aquesta classe de context després de generar el codi.

Registra cadenes de connexió

Això ASP.NET processament específic del nucli. (Si la personalitzeu, podeu utilitzar-la en altres aplicacions del .NET Core, però ASP.NET podeu gestionar-la de manera predeterminada per al Nucli).

La cadena de connexió especificada a la consola del Gestor de paquets només s'ha utilitzat per generar el model.

La cadena de connexió per connectar-se a la base de dades com a aplicació web es mostra a appsettings.json. Si voleu canviar la destinació de la base de dades per connectar-vos a cada versió o publicació, podeu utilitzar appsettings. També pot ser ramificada per Development.json, etc.

A més, com que la cadena de connexió aquí s'utilitza com a operació, prenem mesures com fer de l'usuari de connexió un usuari dedicat tenint en compte la seguretat, etc.

Si l'establiu a appsettings.json, creeu una secció ConnectionStrings a la secció arrel (un objecte, no exactament una secció). Creeu-hi un conjunt de claus i valors. El nom de la clau pot ser qualsevol cosa, però s'utilitzarà més endavant. El valor especifica una cadena de connexió.

{
  // 

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

Fes que el nucli del framework d'entitats estigui disponible per als programes

Això ASP.NET processament específic del nucli. (Si la personalitzeu, podeu utilitzar-la en altres aplicacions del .NET Core, però ASP.NET podeu gestionar-la de manera predeterminada per al Nucli).

ASP.NET Core, cada instància té un temps de supervivència, que és diferent de les consoles i les aplicacions d'escriptori. Per exemple, "Des del moment en què s'inicia el servei web fins que s'atura" o "des del moment en què es rep la sol·licitud fins que es retorna la resposta". ASP.NET marc de treball Core, que es pot col·locar al nucli, ServiceLifetime.Scoped especifica per defecte. Si no hi ha cap motiu especial, podeu quedar-vos així.

Per permetre que el programa accedeixi al context de la base de dades, Startup.ConfigureServices afegiu-lo a :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> L'argument de tipus del mètode especifica la classe de context que heu creat.

options.UseSqlServer El mètode indica que s'utilitza el servidor SQL.

Configuration.GetConnectionString("TestDatabaseDbContext") especifica el nom de la clau registrada amb appsettings.json.

ASP.NET cas d'ús en MVC central

ASP.NET són diverses maneres d'utilitzar el nucli del marc de treball de l'entitat al core MVC.

Afegeix di (inserció de dependència) a un controlador

Registrant .cs services.AddDbContext mètode en iniciar.cs TestDatabaseDbContext Es pot inserir al controlador.

Un exemple de DI HomeController és que el constructor té un ILogger<HomeController> logger argument. Això s'afegeix per DI. Podeu TestDatabaseDbContext inserir-lo de la mateixa manera.

Si HomeController voleu afegir a un existent , té aquest aspecte: Per descomptat, es pot afegir a altres controladors.

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

A continuació, podeu accedir a la base de dades mitjançant la instància del context rebut en cada acció.

Casos d'ús

El codi següent és el codi que gestiona la fitxa d'usuaris i els nous registres. A partir d'ara ASP.NET nucli, el nucli marc de l'entitat serà codi per a cadascun, de manera que no t'explicaré detalladament.

El model generat per marcs d'entitat encara es pot utilitzar com a model per a accions. També podeu crear un model separat i ajustar i utilitzar el model principal del marc de marc d'entitat.

A més, el context es descarta automàticament quan la sol·licitud de l'usuari ha acabat.

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

  // ここまで追加

  // 省略
}

Atès que és problemàtic crear la pantalla manualment, la pantalla de la llista es genera automàticament mitjançant bastides.

La Views/Home/List.cshtml generació automàtica és la següent:

@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 Afegeix un enllaç a la transició de pantalla a la llista.

<!-- 省略 -->

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

La pantalla de registre d'usuaris també es genera automàticament.

La Views/Home/Create.cshtml generació automàtica és la següent: És difícil d'utilitzar tal com és, així que ho he arreglat una mica.

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

Executa i confirma. Per cert, no hi ha mesures de seguretat com el registre de contrasenyes, així que seguiu ASP.NET mètodes de registre core i base de dades quan estigueu operatius.

Per descomptat, es reflecteix a la base de dades.

Aquests consells no creen edicions ni supressions, de manera que podeu utilitzar l'edició al | Detalls | Suprimeix" també causa un error. Podeu crear-lo de la mateixa manera que Crea, així que proveu-ho. Els tres processos anteriors també s'han afegit al codi d'exemple.

Obtén el context de la base de dades de RequestServices

Afegir di a un constructor de controladors pot ser una mica molest perquè heu d'afegir-lo a tots els controladors que necessiteu. Alternativament, RequestServices podeu obtenir de .

No està inclosa en el codi de mostra, però es pot obtenir de la següent manera.

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

Crea un context de base de dades directament

També s'utilitza en consoles i aplicacions d'escriptori. Podeu utilitzar aquest mètode sense cap problema. No es recomana perquè l'abast de les transaccions sol ser ambigu en aplicacions web on és probable que es produeixi un accés simultani. En particular, és possible que les actualitzacions no es puguin tornar a introduir a una base de sol·licitud per sol·licitud.

Si accediu a la base de dades d'aquesta manera, DbContext utilitzareu una tècnica per derivar.

En primer lloc, Startup modifiqueu el per treballar amb Configuration static el .

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

  // 省略
}

TestDatabaseDbContext Creeu una classe TestDatabaseDbContextEx derivada i establiu la cadena de connexió appsettings.json. Si podeu establir una cadena de connexió, podeu agafar un altre mètode, com ara passar-lo a través d'un constructor.

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

Si voleu accedir a la base de dades, genereu i utilitzeu instàncies de les classes derivades.

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

ASP.NET exemple en una pàgina d'navalla central

ASP.NET diverses maneres d'utilitzar el nucli del marc de treball de l'entitat en una pàgina d'navalla principal.

Afegeix di (inserció de dependència) al model de pàgina

Registrant .cs services.AddDbContext mètode en iniciar.cs TestDatabaseDbContext Es pot inserir en un model de pàgina.

Un exemple de DI IndexModel és que el constructor té un ILogger<IndexModel> logger argument. Això s'afegeix per DI. Podeu TestDatabaseDbContext inserir-lo de la mateixa manera.

Si IndexModel voleu afegir a un existent , té aquest aspecte: Per descomptat, es pot afegir a altres models de pàgines.

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

A continuació, podeu accedir a la base de dades mitjançant la instància del context que heu rebut en cada procés.

Casos d'ús

El codi següent és el codi que gestiona la fitxa d'usuaris i els nous registres. Tant ASP.NET nucli principal com l'entitat marc seran codi, de manera que no entraré en detalls. A més, el context es descarta automàticament quan la sol·licitud de l'usuari ha acabat.

Crea un model de pàgina per a la pantalla de llista.

List.cshtml.cs de la següent manera:

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 es crea de la següent manera:

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

Afegiu-lo a Index.cshtml perquè pugueu passar a la pàgina Llista.

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

Crea també una pantalla de registre d'usuaris.

Codi create.cshtml.cs de la manera següent:

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 de la manera següent:

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

Executa i confirma. Per cert, no hi ha mesures de seguretat com el registre de contrasenyes, així que seguiu ASP.NET mètodes de registre core i base de dades quan estigueu operatius.

Per descomptat, es reflecteix a la base de dades.

No he fet cap edició ni supressió, així que no vull que l'edició | Detalls | Suprimeix" també causa un error. Podeu crear-lo de la mateixa manera que Crea, així que proveu-ho. Els tres processos anteriors també s'han afegit al codi d'exemple.

Obtén el context de la base de dades de RequestServices

Afegir di a un constructor de models de pàgina és una mica molest perquè heu d'afegir-lo a tots els models de pàgina que necessiteu. Alternativament, RequestServices podeu obtenir de .

No està inclosa en el codi de mostra, però es pot obtenir de la següent manera.

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

Crea un context de base de dades directament

També s'utilitza en consoles i aplicacions d'escriptori. Podeu utilitzar aquest mètode sense cap problema. No es recomana perquè l'abast de les transaccions sol ser ambigu en aplicacions web on és probable que es produeixi un accés simultani. En particular, és possible que les actualitzacions no es puguin tornar a introduir a una base de sol·licitud per sol·licitud.

Si accediu a la base de dades d'aquesta manera, DbContext utilitzareu una tècnica per derivar.

En primer lloc, Startup modifiqueu el per treballar amb Configuration static el .

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

  // 省略
}

TestDatabaseDbContext Creeu una classe TestDatabaseDbContextEx derivada i establiu la cadena de connexió appsettings.json. Si podeu establir una cadena de connexió, podeu agafar un altre mètode, com ara passar-lo a través d'un constructor.

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

Si voleu accedir a la base de dades, genereu i utilitzeu instàncies de les classes derivades.

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