ASP.NET баз даних за допомогою ядра структури сутностей у ядрі

Дата створення сторінки :

Середовищі

Візуальна студія
  • Visual Studio 2019
ASP.NET ядро
  • 3.1 (MVC, сторінка бритви)
Сервер SQL
  • 2019 Експрес

Спочатку

У цій ASP.NET кроки з використання фреймворку сутностей за допомогою наступного базового підходу.

Створення бази даних за допомогою Сутності Framework Core і так далі не є основним фокусом цих порад, тому ми не будемо в подробиці. Вони ASP.NET використовуються таким же чином за межами Core.

Цього разу sql Server інсталюється на інший сервер і підключається автентифікацією SQL Server. Єдина відмінність від аутентифікації Windows, яка використовується при локальній установці, - це рядок підключення, і різниці в програмі немає.

Створення таблиці бази даних

У цій пораді використовується SQL Server. Інсталюйте SQL Server у локальному середовищі або на будь-якому сервері.

Якщо у вас немає бази даних для тестування, створіть базу даних.

У разі створення в SQL, наприклад нижче, змініть шлях версії SQL Server та ім'я бази даних відповідно до вашого середовища.

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

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

Якщо ви хочете створити його в 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

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

Якщо ви хочете додати його в 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 сутностей, доступних у Core

Цей елемент є спільним як для сторінок MVC, так і для razor.

Пакетна інсталяція фреймворкного ядра сутності

Після створення проекту отримайте пакет від NuGet, щоб спочатку можна було використовувати Ядро структури сутностей. MVC є прикладом, але операція однакова на сторінках бритви.

Клацніть правою кнопкою миші елементи Залежності проекту та виберіть пункт Керування пакетами NuGet.

Вибирав "Огляд" на вкладці, введіть у полі пошуку пункт "Параметри об'єкта сутності". Пакети, пов'язані з сутністю Framework Core, з'являються у списку.

З цього часу я буду використовувати SQL Server, тому я встановлю наступні пакети.

  • Піктограма фреймів сутності (Microsoft)
  • Microsoft.Параметри фреймів сутностей.Інструменти
  • Microsoft.Параметри фреймів сутності.SqlСерватор

Давайте встановимо Microsoft.EntityFrameworkCore як приклад, тому встановіть і два інших.

Виберіть, що потрібно інсталювати, а потім натисніть кнопку інсталювати. Версія вибирає новітній стабілізатор.

У діалоговому вікні можна натиснути кнопку Гаразд.

Встановіть і два інших.

Я думаю, що пакет наступний.

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

Якщо потрібно отримати або оновити дані з бази даних у фреймворку сутностей, Зазвичай потрібно створити програму, яка є моделлю на основі конфігурації таблиці. Цю модель також називають псевдонімом.

Під час створення моделі, спочатку коду, методу створення таблиць у базі даних із моделі (програми) або Спочатку є база даних, яка є технікою створення моделей (програм) з таблиць. Ось простий спосіб автоматичної програми бази даних з таблиці.

До речі, ці кроки ASP.NET Core, тому ви можете створювати їх в консоль або настільному додатку таким же чином.

По-перше, побудувати проект один раз, щоб переконатися, що немає помилок. Якщо сталася помилка, створити модель неможливо. Його не потрібно будувати, якщо ви вже перевірялися, що помилок немає.

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

Ви побачите вікно, подібне до наведеного нижче, тому переконайтеся, що проект за промовчанням у верхньому правому куті – це проект, який потрібно моделювати. (Ви повинні бути обережні, якщо у вас є кілька проектів)

У полі вводу введіть такий текст: Параметри варіюються в залежності від навколишнього середовища, тому, будь ласка, змініть їх своєчасно на наступний опис. (особливо там, де це ***** зокрема)

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 SQL Server. Microsoft.Параметри фреймів сутності.SqlСерватор
Підключення Рядок підключення для підключення до бази даних. Рядки з' єднання можна використовувати і у інших спільних програмах, отже, будь ласка, напишіть те, що ви вкажете відповідно до рядка з' єднання kineki. Доступна автентифікація Windows і автентифікація SQL Server. До речі, вона використовується тільки тимчасово для створення моделі, тому вам не потрібно знати про безпеку після публікації програми для цього рядка підключення. Остерігайтеся втечі, якщо у вас є символ у вашому паролі. "Джерело даних=Ім'я_сервера\SQLEXPRESS;База даних=Тестова база даних;ідентифікатор користувача=Ім'я користувача;пароль=********
F Примусово перезаписувати, навіть якщо вже є програма. <Ні >
Вихідний дані Шлях до теки, до якої видається код. Відносний шлях із папки проекту Моделі\База даних
Контексті Ім'я класу контексту під час використання фреймворку сутностей Перевіркаба данихДослідування бази даних
Використовувати імена бази даних Якщо вказано, ім'я таблиці бази даних стає іменем класу таким, як воно є. В іншому випадку регістр і множинна форма імені класу сутності коригуються відповідно до правил. <Ні >
Примітки до даних Якщо вказано, тип стовпця автоматично додає атрибут DataAnnotation до кожної властивості. Це трохи корисно, якщо ви хочете автоматично перевірити вхідні дані відповідно до типу бази даних. <Ні >

Натискання Enter для запуску автоматично створить код наступним чином:

Код моделі для таблиці User наступний:

[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. Якщо потрібно змінити місце призначення бази даних для підключення до кожної збірки або публікації, можна скористатися параметрами програм. Він також може бути розгалужений 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, кожен екземпляр має час виживання, який відрізняється від консолей та настільних додатків. Наприклад, "З моменту початку роботи веб-служби до її зупинення" або "від моменту отримання запиту до повернення відповіді". 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 Server.

Configuration.GetConnectionString("TestDatabaseDbContext") вказує ім'я ключа, зареєстроване за допомогою appsettings.json.

ASP.NET використання в Core MVC

ASP.NET є кілька способів використання сутності фреймворк core в 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 core Entity Framework Core буде кодом для кожного, тому детально пояснювати не буду.

Створена сутністю Модель 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 і методів реєстрації бази даних при експлуатації.

Звичайно, це відображено в базі даних.

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

Отримання контексту бази даних із requestServices

Додавання 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);
}

Створення контексту бази даних безпосередньо

Він також використовується в консолях і настільних додатках. Ви можете використовувати цей метод без будь-яких проблем. Це не рекомендується, оскільки обсяг транзакцій має тенденцію бути неоднозначним у веб-додатках, де, ймовірно, відбувається одночасний доступ. Зокрема, оновлення можуть бути не в змозі бути відкочені на основі запиту за запитом.

Якщо таким чином отримати доступ до бази даних, 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 кілька способів використання Ядра структури сутностей на сторінці 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 і методів реєстрації бази даних при експлуатації.

Звичайно, це відображено в базі даних.

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

Отримання контексту бази даних із requestServices

Додавання di до конструктора моделі сторінки є трохи громіздким, оскільки ви повинні додати його до всіх необхідних моделей сторінок. Крім того, RequestServices ви можете отримати від .

Він не входить до зразка коду, але його можна отримати наступним чином.

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

Створення контексту бази даних безпосередньо

Він також використовується в консолях і настільних додатках. Ви можете використовувати цей метод без будь-яких проблем. Це не рекомендується, оскільки обсяг транзакцій має тенденцію бути неоднозначним у веб-додатках, де, ймовірно, відбувається одночасний доступ. Зокрема, оновлення можуть бути не в змозі бути відкочені на основі запиту за запитом.

Якщо таким чином отримати доступ до бази даних, 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();
}