ASP.NET баз данных с помощью рамочного ядра entity в core

Дата создания страницы :

окружающая среда

Визуальная студия
  • Визуальная студия 2019
ASP.NET ядро
  • 3.1 (MVC, страница бритвы)
Сервер СЗЛ
  • 2019 Экспресс

сначала

Это ASP.NET шагах по использованию рамочного ядра Entity с использованием подхода Following Core.

Создание базы данных, использование entity Framework Core и так далее не являются основным направлением этих советов, поэтому мы не будем подробно. Они ASP.NET используются таким же образом за пределами Core.

На этот раз сервер sql устанавливается на другом сервере и подключаем к серверу аутентификации S'L Server. Единственным отличием от проверки подлинности Windows, используемой во время локальной установки, является строка соединения, и в программе нет никакой разницы.

Создание таблицы баз данных

В этом совете используется сервер S'L. Установите сервер S'L в локальной среде или на любом сервере.

Если у вас нет базы данных для тестирования, создайте базу данных.

Если вы создаете в S'L, например, следующие, измените путь версии сервера и название базы данных в соответствии с вашей средой.

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

Создайте таблицу для тестирования. Установите основной ключ для обновлений и удалений.

Если вы хотите создать его в S'L:

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

Добавить запись для отображения.

Если вы хотите добавить его в S'L:

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 сущности, доступная в Core

Этот элемент является общим для страниц MVC и Razor.

Пакетная установка рамочного ядра entity

После создания проекта получите пакет от NuGet, чтобы сначала использовать Фрейминг Ядро Entity. MVC является примером, но операция такая же на страницах бритвы.

Зависимости от проекта справа и выберите пакеты Manage NuGet.

При просмотре, выбранном из вкладки, ввяйте EntityFrameworkCore в поле поиска. В списке отображаются пакеты, связанные с основой entity Framework.

С этого времени я буду использовать сервер S'L, поэтому я установю следующие пакеты.

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

Давайте установим Microsoft.EntityFrameworkCore в качестве примера, так что установите два других, а также.

Выберите то, что вы хотите установить, а затем нажмите кнопку установки. Версия выбирает новейший стабилизатор.

Диалог в основном нормально нажать нормально.

Установите два других, а также.

Я думаю, что пакет заключается в следующем.

Создание модели (программы) из конфигурации таблицы баз данных

Если вы хотите получить или обновить данные из базы данных в Entity Framework Core, Обычно требуется создать программу, которая является моделью, основанной на конфигурации таблицы. Эта модель также называется сущностью псевдонима.

При создании модели, код во-первых, метод для создания таблиц в базе данных из модели (программы), или Существует база данных во-первых, которая является методом для создания моделей (программ) из таблиц. Вот простой способ автоматической программы из таблицы.

Кстати, эти шаги являются ASP.NET к ядру, так что вы можете создать их в консоли или настольного приложения таким же образом.

Во-первых, создайте проект один раз, чтобы убедиться, что нет ошибок. Если есть ошибка, модель не может быть создана. Вам не нужно строить его, если вы уже проверили, что нет никаких ошибок.

От Visual Studio откройте консоль Package Manager. В противном случае, вы можете открыть его из инструментов, NuGet менеджер пакетов, и пакет менеджер консолей в меню.

Вы увидите окно, похожее на приведенное ниже, поэтому убедитесь, что проект по умолчанию в правом верхнем части проекта, который вы хотите смоделировать. (Вы должны быть осторожны, если у вас есть несколько проектов)

В поле ввода вввести следующий текст: Параметры варьируются в зависимости от окружающей среды, поэтому, пожалуйста, измените их своевременно на следующее описание. (особенно там, где это, в частности)

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

Дефиса, -Provider например, во главе каждого имени, является имя параметра, а затем значение этого параметра.

Пример параметра Описание параметра
поставщик Исправлена в Microsoft.EntityFrameworkCore.SqlServer сервере S'L. Microsoft.EntityFrameworkCore.SqlServer
связь Строка подключения для подключения к базе данных. Строки подключения могут быть использованы в других приложениях, так что, пожалуйста, напишите то, что вы указываете в соответствии с строкой соединения kineki. Доступны как аутентификация Windows, так и аутентификация сервера S'L Server. Кстати, он лишь временно используется для создания модели, так что вам не нужно быть в курсе безопасности после того, как приложение будет опубликовано для этой строки соединения. Остерегайтесь побега, если у вас есть символ в вашем пароле. "Источник данных "ServerName"S'LEXPRESS;Database-TestDatabase;пользователь id-UserName;password"
фа Сила перезаписи, даже если уже есть программа. хт;Нет, нет,
ВыходDir Путь папки, к которому выводится код. Относительный путь из папки проекта Модели»База данных
контекст Имя класса контекста при использовании Фреймворка Сущности TestDatabaseDbContext
ИспользоватьDatabaseИмя Если указано, название таблицы базы данных становится именем класса. В противном случае корпус и множественная форма имени класса сущности корректируются в соответствии с правилами. хт;Нет, нет,
DataАнотации Если указано, тип столбца автоматически добавляет атрибут DataAnnotation к каждому свойству. Это немного полезно, если вы хотите автоматически проверить вход в зависимости от типа базы данных. хт;Нет, нет,

Нажатие Enter для его запуска автоматически генерирует код следующим образом:

Код модели для таблицы пользователя заключается в следующем:

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

Кстати, предупреждение отображается потому, что строка соединения указана так же, как и в коде сгенерированного класса контекста. Не забудьте удалить OnConfiguring методы в этом классе контекста после получения кода.

Регистрация строк соединения

Это ASP.NET основной конкретной обработки. (Если настроить его, вы можете использовать его в других приложениях .NET Core, но ASP.NET вы можете справиться с ним по умолчанию для Core.)

Строка соединения, указанная в консоли Package Manager, использовалась только для создания модели.

Строка соединения для подключения к базе данных в качестве веб-приложения указана в appsettings.json. Если вы хотите изменить назначение базы данных для подключения к каждой сборке или публикации, вы можете использовать appsettings. Он также может быть разветвлен Development.json и т.д.

Кроме того, поскольку строка соединения здесь используется в качестве операции, давайте принять такие меры, как сделать пользователя соединения преданным пользователем с учетом безопасности и т.д.

Если вы установите его на appsettings.json, создайте раздел ConnectionStrings в корневой секции (объект, не совсем раздел). Создайте набор ключей и значений в нем. Название ключа может быть что угодно, но оно будет использовано позже. Значение определяет строку соединения.

{
  // 

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

Сделать рамочное ядро сущности доступным для программ

Это ASP.NET основной конкретной обработки. (Если настроить его, вы можете использовать его в других приложениях .NET Core, но ASP.NET вы можете справиться с ним по умолчанию для Core.)

ASP.NET Core, каждый экземпляр имеет время выживания, которое отличается от консолей и настольных приложений. Например, "С времени начала Web-сервиса до его остановления" или "с времени получения запроса до возвращения ответа". ASP.NET Core, которая может быть размещена в Core, ServiceLifetime.Scoped определяется по умолчанию. Если нет особой причины, вы можете остаться таким образом.

Чтобы программа можно было получить доступ к контексту базы данных, Startup.ConfigureServices добавьте ее в:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Аргумент типа метода определяет созданный вами контекстный класс.

options.UseSqlServer Метод указывает на то, что используется сервер sql.

Configuration.GetConnectionString("TestDatabaseDbContext") указывает ключевое имя, зарегистрированное на appsettings.json.

ASP.NET использования в Core MVC

ASP.NET несколько способов использования рамочного ядра entity в Core MVC.

Добавить di (вставка зависимости) к контроллеру

Зарегистрировав .cs services.AddDbContext в стартапе.cs TestDatabaseDbContext Он может быть вставлен в контроллер.

Примером DI HomeController является то, что конструктор имеет ILogger<HomeController> logger аргумент. Об этом сообщает DI. Вы можете TestDatabaseDbContext вставить таким же образом.

Если HomeController вы хотите добавить к существующему, это выглядит так: Конечно, его можно добавить к другим контроллерам.

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

Затем можно получить доступ к базе данных, используя экземпляр полученного контекста в каждом действии.

Использование кейсов

Следующим кодом является код, который обрабатывает список пользователей и новые регистрации. Отныне ASP.NET, Entity Framework Core будет кодом для каждого, поэтому я не буду подробно объяснять.

Модель, генерируемая фреймворка Framework Core, по-прежнему может использоваться в качестве модели действий. Можно также создать отдельную модель, обернуть и использовать модель Entity Framework Core.

Кроме того, контекст автоматически отбрасывается по просьбе пользователя.

ГлавнаяКонтроллер.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));
  }

  // ここまで追加

  // 省略
}

Так как это хлопотно, чтобы создать экран вручную, экран списка автоматически генерируется леса.

Автоматическое Views/Home/List.cshtml генерируется следующим образом:

@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 Добавьте ссылку на переход экрана в список.

<!-- 省略 -->

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

Экран регистрации пользователя также автоматически генерируется.

Автоматическое Views/Home/Create.cshtml генерируется следующим образом: Это трудно использовать, как она есть, так что я установил его немного.

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

Беги и подтверждай. Кстати, нет никаких мер безопасности, таких как регистрация паролей, поэтому, пожалуйста, следуйте ASP.NET Core и методам регистрации баз данных при работе.

Конечно, это отражено в базе данных.

Этот совет не создает правки или удаления, поэтому вы можете использовать правую | Подробности | Удалить" также вызывает ошибку. Вы можете создать его так же, как создать, так что дайте ему попробовать. Вышеуказанные три процесса также были добавлены в пример кода.

Получить контекст базы данных из ЗапросСервисы

Добавление di к конструктору контроллера может быть немного громоздким, потому что вы должны добавить его ко всем контроллерам, которые вам нужны. Кроме того, RequestServices вы можете получить от .

Он не включен в образец кода, но его можно получить следующим образом.

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

Создание контекста базы данных напрямую

Он также используется в консолях и настольных приложениях. Вы можете использовать этот метод без каких-либо проблем. Это не рекомендуется, поскольку сфера действия транзакций, как правило, неоднозначна в web-приложениях, где может произойти одновременный доступ. В частности, обновления не могут быть перенесены на основу запроса по запросу.

Если вы получаете доступ к базе данных таким DbContext образом, вы будете использовать технику для получения .

StartupВо-первых, изменить для работы с 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 Создайте TestDatabaseDbContextEx класс, полученный из строки соединения appsettings.json, и установите ее. Если можно установить строку соединения, можно использовать другой метод, например, пройти через конструктора.

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

Если вы хотите получить доступ к базе данных, создать и использовать экземпляры производных классов.

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

ASP.NET пример на странице Core Razor

ASP.NET несколько способов использования Рамочного ядра Entity на странице Core Razor.

Добавить di (вставка зависимости) в модель страницы

Зарегистрировав .cs services.AddDbContext в стартапе.cs TestDatabaseDbContext Он может быть вставлен в модель страницы.

Примером DI IndexModel является то, что конструктор имеет ILogger<IndexModel> logger аргумент. Об этом сообщает DI. Вы можете TestDatabaseDbContext вставить таким же образом.

Если IndexModel вы хотите добавить к существующему, это выглядит так: Конечно, его можно добавить к другим моделям страниц.

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

Затем можно получить доступ к базе данных, используя экземпляр контекста, полученного в каждом процессе.

Использование кейсов

Следующим кодом является код, который обрабатывает список пользователей и новые регистрации. Оба ASP.NET Core и Entity Framework Core будут кодом, поэтому я не буду входить в подробности. Кроме того, контекст автоматически отбрасывается по просьбе пользователя.

Создайте модель страницы для экрана списка.

List.cshtml.cs следующим образом:

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 создается следующим образом:

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

Добавьте его в Index.cshtml, чтобы можно было перейти на страницу списка.

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

Создайте экран регистрации пользователей.

Код Create.cshtml.cs следующим образом:

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 следующим образом:

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

Беги и подтверждай. Кстати, нет никаких мер безопасности, таких как регистрация паролей, поэтому, пожалуйста, следуйте ASP.NET Core и методам регистрации баз данных при работе.

Конечно, это отражено в базе данных.

Я не создал никаких правок или удалений, поэтому я не хочу редактировать, чтобы | Подробности | Удалить" также вызывает ошибку. Вы можете создать его так же, как создать, так что дайте ему попробовать. Вышеуказанные три процесса также были добавлены в пример кода.

Получить контекст базы данных из ЗапросСервисы

Добавление di к конструктору модели страницы немного обременительно, потому что вы должны добавить его ко всем моделям страниц, которые вам нужны. Кроме того, RequestServices вы можете получить от .

Он не включен в образец кода, но его можно получить следующим образом.

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

Создание контекста базы данных напрямую

Он также используется в консолях и настольных приложениях. Вы можете использовать этот метод без каких-либо проблем. Это не рекомендуется, поскольку сфера действия транзакций, как правило, неоднозначна в web-приложениях, где может произойти одновременный доступ. В частности, обновления не могут быть перенесены на основу запроса по запросу.

Если вы получаете доступ к базе данных таким DbContext образом, вы будете использовать технику для получения .

StartupВо-первых, изменить для работы с 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 Создайте TestDatabaseDbContextEx класс, полученный из строки соединения appsettings.json, и установите ее. Если можно установить строку соединения, можно использовать другой метод, например, пройти через конструктора.

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

Если вы хотите получить доступ к базе данных, создать и использовать экземпляры производных классов.

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