ASP.NET bancos de dados usando o Núcleo de Estrutura de Entidades no Núcleo

Data de criação de página :

ambiente

Estúdio Visual
  • Visual Studio 2019
Núcleo ASP.NET
  • 3.1 (MVC, página de navalha)
Servidor SQL
  • Expresso 2019

inicialmente

Esta dica ASP.NET etapas para usar o Entity Framework Core usando a abordagem Seguinte Núcleo.

Criar um banco de dados, usar o Entity Framework Core, e assim por diante não são o foco principal dessas dicas, por isso não entraremos em detalhes. Eles ASP.NET usados da mesma forma fora do Core.

Desta vez, o servidor sql é instalado em um servidor diferente e conectado pela autenticação do SQL Server. A única diferença da autenticação do Windows usada durante uma instalação local é a sequência de conexão, e não há diferença no programa.

Crie uma tabela de banco de dados

Esta dica usa o SQL Server. Instale o SQL Server em seu ambiente local ou em qualquer servidor.

Se você não tiver um banco de dados para testes, crie um banco de dados.

Se você estiver criando no SQL, como o seguinte, altere o caminho da versão do SQL Server e o nome do banco de dados para se adequar ao seu ambiente.

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

Crie uma tabela para testes. Defina a chave principal para atualizações e exclusões.

Se você quiser criá-lo em 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

Adicione um registro para exibição.

Se você quiser adicioná-lo em 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 estrutura de entidades disponível no Core

Este item é comum tanto para as páginas MVC quanto razor.

Instalação do pacote do Núcleo-Quadro da Entidade

Depois de criar seu projeto, obtenha o pacote do NuGet para que você possa usar o Entity Framework Core primeiro. MVC é um exemplo, mas a operação é a mesma em páginas de navalha.

Clique com o botão direito do mouse Em Dependências do projeto e selecione Gerenciar pacotes NuGet.

Com o Procurar selecionado na guia, digite EntityFrameworkCore no campo de pesquisa. Os pacotes relacionados ao Núcleo de Quadro da Entidade aparecem na lista.

A partir deste momento, vou usar o SQL Server, então vou instalar os seguintes pacotes.

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

Vamos instalar o Microsoft.EntityFrameworkCore como exemplo, então instale os outros dois também.

Selecione o que deseja instalar e clique no botão instalar. A versão seleciona o estabilizador mais recente.

O diálogo é basicamente ok para clicar em ok.

Instale os outros dois também.

Acho que o pacote é o seguinte.

Crie um modelo (programa) a partir de uma configuração de tabela de banco de dados

Se você quiser recuperar ou atualizar dados de um banco de dados no Entity Framework Core, Você geralmente precisa criar um programa que seja um modelo baseado na configuração da tabela. Esse modelo também é chamado de entidade de pseudônimo.

Quando você cria um modelo, código primeiro, uma técnica para criar tabelas em um banco de dados a partir de um modelo (programa), ou Há primeiro banco de dados, que é uma técnica para criar modelos (programas) a partir de tabelas. Aqui está uma maneira simples de programar automaticamente a partir de uma tabela.

A propósito, essas etapas são ASP.NET para o Core, para que você possa criá-las no console ou aplicativo de desktop da mesma forma.

Primeiro, construa o projeto uma vez para ter certeza de que não há erros. Se houver um erro, o modelo não pode ser criado. Você não precisa construí-lo se você já verificou que não há erros.

Do Visual Studio, abra o console Package Manager. Caso contrário, você pode abri-lo a partir das ferramentas, NuGet Package Manager e Package Manager consoles no menu.

Você verá uma janela semelhante à abaixo, então certifique-se de que o Projeto Padrão no canto superior direito é o projeto que você deseja modelar. (Você precisa ter cuidado se você tem vários projetos)

No campo de entrada, digite o seguinte texto: Os parâmetros variam dependendo do ambiente, por isso, alterá-los em tempo hábil para a seguinte descrição. (especialmente onde está ***** em particular)

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

Um hifenizado, -Provider como na cabeça de cada nome, é o nome do parâmetro, seguido pelo valor desse parâmetro.

Exemplo de parâmetro
de descrição do parâmetro
provedor Fixado em Microsoft.EntityFrameworkCore.SqlServer SQL Server. Microsoft.EntityFrameworkCore.SqlServer
conexão String de conexão para conexão ao banco de dados. As strings de conexão podem ser usadas em outros aplicativos em comum, então escreva o que você especifica de acordo com o kineki de string de conexão. Tanto a autenticação do Windows quanto a autenticação do SQL Server estão disponíveis. A propósito, ele é usado apenas temporariamente para criar um modelo, então você não precisa estar ciente da segurança depois que o aplicativo é publicado para esta sequência de conexão. Cuidado com a fuga se você tiver um símbolo em sua senha. "Fonte de dados=ServerName\SQLEXPRESS;Banco de dados=TestDatabase;user id=UserName;password=***********
Forçar a substituição, mesmo que já exista um programa. <No >
OutputDir O caminho da pasta para o qual o código é de saída. Caminho relativo da pasta do projeto Modelos\Banco de dados
contexto Nome da classe de contexto ao usar o Quadro de Entidades TestDatabaseDbContext
UseDetabaseNames Se especificado, o nome da tabela do banco de dados torna-se o nome da classe como ele é. Caso contrário, o caso e a forma múltipla do nome da classe da entidade são ajustados de acordo com as regras. <No >
DataAnnotations Se especificado, o tipo de coluna anexa automaticamente o atributo DataAnnotation a cada propriedade. Isso é um pouco útil se você quiser verificar automaticamente a entrada de acordo com o tipo do banco de dados. <No >

Pressionando Enter para executá-lo gerará automaticamente código da seguinte forma:

O código de modelo da tabela Usuário é o seguinte:

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

A propósito, o aviso é exibido porque a sequência de conexão está listada como está no código da classe de contexto gerado. Certifique-se de excluir OnConfiguring os métodos nesta classe de contexto após a gerada pelo código.

Registre strings de conexão

Isso ASP.NET processamento específico do núcleo. (Se você personalizá-lo, você pode usá-lo em outros aplicativos .NET Core, mas ASP.NET você pode lidar com isso por padrão para Core.)

A sequência de conexão especificada no console Package Manager foi usada apenas para gerar o modelo.

A sequência de conexão para se conectar ao banco de dados como um aplicativo web está listada em appsettings.json. Se você quiser alterar o destino do banco de dados para se conectar para cada compilação ou publicação, você pode usar aplicativos. Também pode ser ramificada pela Development.json, etc.

Além disso, uma vez que a sequência de conexão aqui é usada como operação, vamos tomar medidas como tornar o usuário de conexão um usuário dedicado em consideração à segurança etc.

Se você defini-lo para appsettings.json, crie uma seção ConnectionStrings na seção raiz (um objeto, não exatamente uma seção). Crie um conjunto de chaves e valores nele. O nome da chave pode ser qualquer coisa, mas será usado mais tarde. O valor especifica uma sequência de conexão.

{
  // 

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

Disponibilize o Núcleo-Quadro de Entidades para programas

Isso ASP.NET processamento específico do núcleo. (Se você personalizá-lo, você pode usá-lo em outros aplicativos .NET Core, mas ASP.NET você pode lidar com isso por padrão para Core.)

ASP.NET Core, cada instância tem um tempo de sobrevivência, que é diferente de consoles e aplicativos de desktop. Por exemplo, "A partir do momento em que o serviço da Web é iniciado até que ele seja interrompido" ou "a partir do momento em que a solicitação é recebida até que a resposta seja devolvida". ASP.NET framework Core, que pode ser colocado no Núcleo, ServiceLifetime.Scoped especifica por padrão. Se não há uma razão especial, você pode ficar assim.

Para permitir que seu programa acesse o contexto do banco de dados, Startup.ConfigureServices adicione-o 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> O tipo de argumento do método especifica a classe de contexto que você criou.

options.UseSqlServer O método indica que o servidor sql é usado.

Configuration.GetConnectionString("TestDatabaseDbContext") especifica o nome da chave registrado com appsettings.json.

ASP.NET caso de uso em Core MVC

ASP.NET são várias maneiras de usar o Núcleo de Estrutura de Entidades no Core MVC.

Adicione di (inserção de dependência) a um controlador

Registrando .cs services.AddDbContext método em startup.cs TestDatabaseDbContext Pode ser inserido no controlador.

Um exemplo de DI HomeController é que o construtor tem um ILogger<HomeController> logger argumento. Isso é adicionado por DI. Você pode inserir TestDatabaseDbContext da mesma maneira.

Se você HomeController quiser adicionar a um existente, ele se parece com este: Claro, pode ser adicionado a outros 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;  // 追加
  }
  
  // 省略
}

Em seguida, você pode acessar o banco de dados usando a instância do contexto recebido em cada ação.

Casos de uso

O código a seguir é o código que lida com a listagem de usuários e novos registros. De agora em diante ASP.NET núcleo, o Núcleo-Quadro da Entidade será código para cada um, por isso não explicarei em detalhes.

O modelo de núcleo-quadro da entidade ainda pode ser usado como modelo de ações. Você também pode criar um modelo separado e embrulhar e usar o modelo Entity Framework Core.

Além disso, o contexto é automaticamente descartado quando a solicitação do usuário acaba.

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

  // ここまで追加

  // 省略
}

Como é problemático criar a tela manualmente, a tela da lista é gerada automaticamente por andaimes.

O Views/Home/List.cshtml autogerálcia é o seguinte:

@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 Adicione um link à transição de tela para a lista.

<!-- 省略 -->

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

A tela de registro do usuário também é gerada automaticamente.

O Views/Home/Create.cshtml autogerálcia é o seguinte: É difícil de usar como é, então eu consertei um pouco.

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

Corra e confirme. A propósito, não existem medidas de segurança, como o registro de senhas, por isso siga ASP.NET métodos de registro do Core e do banco de dados ao operar.

Claro, isso se reflete no banco de dados.

Estas Dicas não criam edições ou exclusões, para que você possa usar a edição à direita | Detalhes | Excluir" também causa um erro. Você pode criá-lo da mesma forma que criar, então tente. Os três processos acima também foram adicionados ao código de amostra.

Obtenha o contexto do banco de dados do RequestServices

Adicionar di a um construtor controlador pode ser um pouco complicado porque você tem que adicioná-lo a todos os controladores que você precisa. Alternativamente, RequestServices você pode obter de .

Não está incluído no código amostral, mas pode ser obtido da seguinte forma.

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

Crie um contexto de banco de dados diretamente

Também é usado em consoles e aplicativos de desktop. Você pode usar este método sem problemas. Não é recomendado porque o escopo das transações tende a ser ambíguo em aplicativos da Web onde o acesso simultâneo pode ocorrer. Em particular, as atualizações podem não ser capazes de ser revertidas para uma base de solicitação por solicitação.

Se você acessar o banco de dados desta forma, DbContext você usará uma técnica para derivar .

Primeiro, Startup modifique o para Configuration static trabalhar.

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

  // 省略
}

TestDatabaseDbContext Crie uma classe TestDatabaseDbContextEx derivada e defina a sequência de conexão appsettings.json. Se você puder definir uma sequência de conexão, você pode pegar outro método, como passá-lo através de um construtor.

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

Se você quiser acessar o banco de dados, gere e use instâncias das classes derivadas.

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

ASP.NET exemplo em uma página do Core Razor

ASP.NET várias maneiras de usar o Entity Framework Core em uma página do Core Razor.

Adicione di (inserção de dependência) ao modelo de página

Registrando .cs services.AddDbContext método em startup.cs TestDatabaseDbContext Pode ser inserido em um modelo de página.

Um exemplo de DI IndexModel é que o construtor tem um ILogger<IndexModel> logger argumento. Isso é adicionado por DI. Você pode inserir TestDatabaseDbContext da mesma maneira.

Se você IndexModel quiser adicionar a um existente, ele se parece com este: Claro, ele pode ser adicionado a outros 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;  // 追加
  }
  
  // 省略
}

Em seguida, você pode acessar o banco de dados usando a instância do contexto que recebeu em cada processo.

Casos de uso

O código a seguir é o código que lida com a listagem de usuários e novos registros. Tanto ASP.NET Core e Entity Framework Core serão código, então não entrarei em detalhes. Além disso, o contexto é automaticamente descartado quando a solicitação do usuário acaba.

Crie um modelo de página para a tela da lista.

List.cshtml.cs a seguir:

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 é criado da seguinte forma:

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

Adicione-o ao Index.cshtml para que você possa fazer a transição para a página Lista.

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

Crie uma tela de registro do usuário também.

Criar.cshtml.cs código da seguinte forma:

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

Criar.cshtml da seguinte forma:

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

Corra e confirme. A propósito, não existem medidas de segurança, como o registro de senhas, por isso siga ASP.NET métodos de registro do Core e do banco de dados ao operar.

Claro, isso se reflete no banco de dados.

Eu não criei nenhuma edição ou exclusões, então eu não quero editar para | Detalhes | Excluir" também causa um erro. Você pode criá-lo da mesma forma que criar, então tente. Os três processos acima também foram adicionados ao código de amostra.

Obtenha o contexto do banco de dados do RequestServices

Adicionar di a um construtor de modelos de página é um pouco complicado porque você tem que adicioná-lo a todos os modelos de página que você precisa. Alternativamente, RequestServices você pode obter de .

Não está incluído no código amostral, mas pode ser obtido da seguinte forma.

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

Crie um contexto de banco de dados diretamente

Também é usado em consoles e aplicativos de desktop. Você pode usar este método sem problemas. Não é recomendado porque o escopo das transações tende a ser ambíguo em aplicativos da Web onde o acesso simultâneo pode ocorrer. Em particular, as atualizações podem não ser capazes de ser revertidas para uma base de solicitação por solicitação.

Se você acessar o banco de dados desta forma, DbContext você usará uma técnica para derivar .

Primeiro, Startup modifique o para Configuration static trabalhar.

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

  // 省略
}

TestDatabaseDbContext Crie uma classe TestDatabaseDbContextEx derivada e defina a sequência de conexão appsettings.json. Se você puder definir uma sequência de conexão, você pode pegar outro método, como passá-lo através de um construtor.

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

Se você quiser acessar o banco de dados, gere e use instâncias das classes derivadas.

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