ASP.NET bases de datos mediante Entity Framework Core en Core

Fecha de creación de la página :

medio ambiente

Estudio visual
  • Visual Studio 2019
Núcleo de ASP.NET
  • 3.1 (MVC, página razor)
SQL Server
  • Expreso 2019

al principio

Esto ASP.NET pasos para usar Entity Framework Core mediante el siguiente enfoque principal.

Crear una base de datos, mediante Entity Framework Core, etc., no son el foco principal de estos consejos, por lo que no entraremos en detalles. Se ASP.NET utilizan de la misma manera fuera de Core.

Esta vez, sql server está instalado en un servidor diferente y conectado por autenticación de SQL ServerSQL Server . La única diferencia con respecto a la autenticación de Windows utilizada durante una instalación local es la cadena de conexión y no hay ninguna diferencia en el programa.

Crear una tabla de base de datos

Estas sugerencias usan SQL Server. Instale SQL Server en el entorno local o en cualquier servidor.

Si no tiene una base de datos para las pruebas, cree una base de datos.

Si está creando en SQL, como el siguiente, cambie la ruta de acceso de la versión de SQL Server y el nombre de la base de datos para que se adapten a su entorno.

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

Cree una tabla para las pruebas. Establezca la clave principal para las actualizaciones y eliminaciones.

Si desea crearlo 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

Agregue un registro para su visualización.

Si desea agregarlo en 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 marco de entidades disponible en Core

Este elemento es común a las páginas MVC y Razor.

Instalación de paquetes de Entity Framework Core

Una vez que haya creado el proyecto, obtenga el paquete de NuGet para que pueda usar Entity Framework Core primero. MVC es un ejemplo, pero la operación es la misma en las páginas de razor.

Haga clic con el botón derecho en Dependencias en el proyecto y seleccione Administrar paquetes NuGet.

Con Examinar seleccionado en la pestaña, escriba EntityFrameworkCore en el campo de búsqueda. Los paquetes relacionados con Entity Framework Core aparecen en la lista.

A partir de este momento, usaré SQL Server, por lo que instalaré los siguientes paquetes.

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

Instalemos Microsoft.EntityFrameworkCore como ejemplo, así que instale los otros dos también.

Seleccione lo que desea instalar y, a continuación, haga clic en el botón instalar. La versión selecciona el estabilizador más reciente.

El cuadro de diálogo está básicamente bien para hacer clic en Aceptar.

Instale los otros dos también.

Creo que el paquete es el siguiente.

Crear un modelo (programa) a partir de una configuración de tabla de base de datos

Si desea recuperar o actualizar datos de una base de datos en Entity Framework Core, Normalmente, debe crear un programa que sea un modelo basado en la configuración de la tabla. Este modelo también se denomina entidad de alias.

Al crear un modelo, primero se codifica una técnica para crear tablas en una base de datos a partir de un modelo (programa) o Primero hay base de datos, que es una técnica para crear modelos (programas) a partir de tablas. Esta es una forma sencilla de programar automáticamente desde una tabla.

Por cierto, estos pasos se ASP.NET a The Core, por lo que puede crearlos en la consola o aplicación de escritorio de la misma manera.

En primer lugar, compile el proyecto una vez para asegurarse de que no hay errores. Si hay un error, no se puede crear el modelo. No es necesario construirlo si ya ha verificado que no hay errores.

En Visual Studio, abra la consola del Administrador de paquetes. De lo contrario, puede abrirlo desde las consolas herramientas, NuGet Package Manager y Package Manager en el menú.

Verá una ventana similar a la siguiente, así que asegúrese de que el proyecto predeterminado en la parte superior derecha es el proyecto que desea modelar. (Debe tener cuidado si tiene varios proyectos)

En el campo de entrada, escriba el texto siguiente: Los parámetros varían dependiendo del entorno, así que por favor cámbielos de manera oportuna a la siguiente descripción. (especialmente donde está ***** 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

Uno con -Provider guiones, como en la cabecera de cada nombre, es el nombre del parámetro, seguido del valor de ese parámetro.

Parameter
Ejemplo del parámetro Parameter Description
proveedor Se corrigió en Microsoft.EntityFrameworkCore.SqlServer SQL Server. Microsoft.EntityFrameworkCore.SqlServer
conexión Cadena de conexión para conectarse a la base de datos. Las cadenas de conexión se pueden usar en otras aplicaciones en común, así que escribe lo que especifiques según la cadena de conexión kineki. Tanto la autenticación de Windows como la autenticación de SQL Server están disponibles. Por cierto, solo se usa temporalmente para crear un modelo, por lo que no es necesario tener en cuenta la seguridad después de que se publique la aplicación para esta cadena de conexión. Tenga cuidado de escapar si tiene un símbolo en su contraseña. "Origen de datos=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=**********
F Forzar la sobreescritura incluso si ya hay un programa. <No >
OutputDir La ruta de acceso de la carpeta a la que se genera el código. Ruta relativa desde la carpeta del proyecto Modelos\Base de datos
contexto Nombre de clase de contexto al usar Entity Framework TestDatabaseDbContext
UseDatabaseNames Si se especifica, el nombre de tabla de la base de datos se convierte en el nombre de clase tal cual. De lo contrario, el caso y la forma múltiple del nombre de la clase de entidad se ajustan según las reglas. <No >
DataAnnotations Si se especifica, el tipo de columna anexa automáticamente el atributo DataAnnotation a cada propiedad. Esto es un poco útil si desea comprobar automáticamente la entrada según el tipo de la base de datos. <No >

Al pulsar Intro para ejecutarlo, se generará automáticamente código de la siguiente manera:

El código de modelo de la tabla User es el siguiente:

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

Por cierto, la advertencia se muestra porque la cadena de conexión aparece tal como está en el código de la clase de contexto generada. Asegúrese de eliminar OnConfiguring los métodos de esta clase de contexto después de generar el código.

Registrar cadenas de conexión

Esto ASP.NET procesamiento específico del núcleo. (Si lo personaliza, puede usarlo en otras aplicaciones de .NET Core, pero ASP.NET puede controlarlo de forma predeterminada para Core.)

La cadena de conexión especificada en la consola del Administrador de paquetes solo se utilizó para generar el modelo.

La cadena de conexión para conectarse a la base de datos como una aplicación web aparece en appsettings.json. Si desea cambiar el destino de la base de datos a la que conectarse para cada compilación o publicación, puede usar appsettings. También puede ser ramificado por Development.json, etc.

Además, dado que la cadena de conexión aquí se utiliza como operación, vamos a tomar medidas como hacer del usuario de conexión un usuario dedicado en consideración a la seguridad, etc.

Si lo establece en appsettings.json, cree una sección ConnectionStrings en la sección raíz (un objeto, no exactamente una sección). Cree un conjunto de claves y valores en él. El nombre de la clave puede ser cualquier cosa, pero se utilizará más adelante. El valor especifica una cadena de conexión.

{
  // 

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

Poner Entity Framework Core a disposición de los programas

Esto ASP.NET procesamiento específico del núcleo. (Si lo personaliza, puede usarlo en otras aplicaciones de .NET Core, pero ASP.NET puede controlarlo de forma predeterminada para Core.)

ASP.NET Core, cada instancia tiene un tiempo de supervivencia, que es diferente de las consolas y las aplicaciones de escritorio. Por ejemplo, "Desde el momento en que se inicia el servicio Web hasta que se detiene" o "desde el momento en que se recibe la solicitud hasta que se devuelve la respuesta". ASP.NET framework Core, que se puede colocar en The Core, ServiceLifetime.Scoped especifica de forma predeterminada. Si no hay una razón especial, puedes quedarte así.

Para permitir que el programa acceda al contexto de la base de datos, Startup.ConfigureServices agréguelo 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> El argumento type del método especifica la clase de contexto que creó.

options.UseSqlServer El método indica que se usa sql server.

Configuration.GetConnectionString("TestDatabaseDbContext") especifica el nombre de clave registrado con appsettings.json.

ASP.NET caso de uso en Core MVC

ASP.NET son varias maneras de usar Entity Framework Core en Core MVC.

Agregar di (inserción de dependencia) a un controlador

Al registrar .cs services.AddDbContext método en el inicio.cs TestDatabaseDbContext Se puede insertar en el controlador.

Un ejemplo de DI HomeController es que el constructor tiene un ILogger<HomeController> logger argumento. Esto es añadido por DI. Puede insertar TestDatabaseDbContext de la misma manera.

Si HomeController desea agregar a un existente , se ve así: Por supuesto, se puede agregar a otros controladores.

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ón, puede tener acceso a la base de datos mediante la instancia del contexto recibido en cada acción.

Casos de uso

El código siguiente es el código que controla la lista de usuarios y los nuevos registros. A partir de ahora ASP.NET núcleo, Entity Framework Core será código para cada uno, por lo que no explicaré en detalle.

El modelo generado por Núcleo de marco de entidades todavía se puede usar como modelo para acciones. También puede crear un modelo independiente y ajustar y usar el modelo de Entity Framework Core.

Además, el contexto se descarta automáticamente cuando la solicitud del usuario ha terminado.

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

  // ここまで追加

  // 省略
}

Dado que es problemático crear la pantalla manualmente, la pantalla de lista se genera automáticamente mediante andamios.

El Views/Home/List.cshtml autogenerado es el siguiente:

@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 Agregue un enlace a la transición de pantalla a la lista.

<!-- 省略 -->

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

La pantalla de registro de usuarios también se genera automáticamente.

El Views/Home/Create.cshtml autogenerado es el siguiente: Es difícil de usar tal como es, así que lo he arreglado un poco.

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

Corre y confirma. Por cierto, no hay medidas de seguridad como el registro de contraseñas, así que siga ASP.NET métodos de registro de núcleos y bases de datos al operar.

Por supuesto, se refleja en la base de datos.

Estas sugerencias no crean ediciones ni eliminaciones, por lo que puede utilizar la edición a la derecha | Detalles | Eliminar" también provoca un error. Puede crearlo de la misma manera que Create, así que pruébalo. Los tres procesos anteriores también se han agregado al código de ejemplo.

Obtener contexto de base de datos de RequestServices

Agregar di a un constructor de controlador puede ser un poco engorroso porque tiene que agregarlo a todos los controladores que necesita. Alternativamente, RequestServices puede obtener de .

No se incluye en el código de ejemplo, pero se puede obtener de la siguiente manera.

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

Cree un contexto de base de datos directamente

También se utiliza en consolas y aplicaciones de escritorio. Puede utilizar este método sin ningún problema. No se recomienda porque el alcance de las transacciones tiende a ser ambiguo en las aplicaciones web donde es probable que se produzca el acceso simultáneo. En particular, es posible que las actualizaciones no puedan revertirse a petición por solicitud.

Si accede a la base de datos de esta manera, DbContext utilizará una técnica para derivar .

En primer lugar, Startup modifique el para trabajar con 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 Cree una clase TestDatabaseDbContextEx derivada y establezca la cadena de conexión appsettings.json. Si puede establecer una cadena de conexión, puede tomar otro método, como pasarlo a través de 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 desea tener acceso a la base de datos, genere y utilice instancias de las clases derivadas.

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

ASP.NET ejemplo en una página de Core Razor

ASP.NET varias formas de usar Entity Framework Core en una página de Core Razor.

Agregar di (inserción de dependencias) al modelo de página

Al registrar .cs services.AddDbContext método en el inicio.cs TestDatabaseDbContext Se puede insertar en un modelo de página.

Un ejemplo de DI IndexModel es que el constructor tiene un ILogger<IndexModel> logger argumento. Esto es añadido por DI. Puede insertar TestDatabaseDbContext de la misma manera.

Si IndexModel desea agregar a un existente , se ve así: Por supuesto, se puede agregar a otros modelos de página.

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ón, puede tener acceso a la base de datos mediante la instancia del contexto que recibió en cada proceso.

Casos de uso

El código siguiente es el código que controla la lista de usuarios y los nuevos registros. Tanto ASP.NET Core como Entity Framework Core serán código, por lo que no entraré en detalles. Además, el contexto se descarta automáticamente cuando la solicitud del usuario ha terminado.

Cree un modelo de página para la pantalla de lista.

List.cshtml.cs de la siguiente 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 se crea de la siguiente 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>

Agréguelo a Index.cshtml para que pueda realizar la transición a la página List.

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

Cree también una pantalla de registro de usuario.

Create.cshtml.cs código de la siguiente manera:

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 siguiente manera:

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

Corre y confirma. Por cierto, no hay medidas de seguridad como el registro de contraseñas, así que siga ASP.NET métodos de registro de núcleos y bases de datos al operar.

Por supuesto, se refleja en la base de datos.

No creé ninguna edición o eliminación, así que no quiero editar para | Detalles | Eliminar" también provoca un error. Puede crearlo de la misma manera que Create, así que pruébalo. Los tres procesos anteriores también se han agregado al código de ejemplo.

Obtener contexto de base de datos de RequestServices

Agregar di a un constructor de modelo de página es un poco engorroso porque tiene que agregarlo a todos los modelos de página que necesita. Alternativamente, RequestServices puede obtener de .

No se incluye en el código de ejemplo, pero se puede obtener de la siguiente manera.

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

Cree un contexto de base de datos directamente

También se utiliza en consolas y aplicaciones de escritorio. Puede utilizar este método sin ningún problema. No se recomienda porque el alcance de las transacciones tiende a ser ambiguo en las aplicaciones web donde es probable que se produzca el acceso simultáneo. En particular, es posible que las actualizaciones no puedan revertirse a petición por solicitud.

Si accede a la base de datos de esta manera, DbContext utilizará una técnica para derivar .

En primer lugar, Startup modifique el para trabajar con 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 Cree una clase TestDatabaseDbContextEx derivada y establezca la cadena de conexión appsettings.json. Si puede establecer una cadena de conexión, puede tomar otro método, como pasarlo a través de 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 desea tener acceso a la base de datos, genere y utilice instancias de las clases derivadas.

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