ASP.NET database dengan menggunakan Entity Framework Core di Core

Tanggal pembuatan halaman :

Lingkungan

Visual Studio
  • Studio Visual 2019
ASP.NET Inti
  • 3.1 (MVC, halaman Pisau Cukur)
SQL Server
  • Ekspres 2019

Pada awalnya

Tips ini ASP.NET langkah-langkah untuk menggunakan Entity Framework Core menggunakan pendekatan Following Core.

Membuat database, menggunakan Entity Framework Core, dan sebagainya bukanlah fokus utama dari tips ini, jadi kami tidak akan masuk ke detail. Mereka ASP.NET dengan cara yang sama di luar Core.

Kali ini, server sql diinstal pada server yang berbeda dan dihubungkan oleh otentikasi SQL Server. Satu-satunya perbedaan dari otentikasi Windows yang digunakan selama instalasi lokal adalah string koneksi, dan tidak ada perbedaan dalam program.

Membuat tabel database

Tips ini menggunakan SQL Server. Instal SQL Server di lingkungan lokal Anda atau di server apa pun.

Jika Anda tidak memiliki database untuk pengujian, buat database.

Jika Anda membuat di SQL, seperti berikut ini, ubah jalur versi SQL Server dan nama database agar sesuai dengan lingkungan Anda.

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

Membuat tabel untuk pengujian. Atur kunci utama untuk pembaruan dan penghapusan.

Jika Anda ingin membuatnya di 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

Menambahkan rekaman untuk ditampilkan.

Jika Anda ingin menambahkannya di 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 entitas yang tersedia di Core

Item ini umum untuk halaman MVC dan Razor.

Instalasi paket Entity Framework Core

Setelah membuat proyek, dapatkan paket dari NuGet sehingga Anda dapat menggunakan Entity Framework Core terlebih dahulu. MVC adalah contoh, tetapi operasinya sama pada halaman pisau cukur.

Klik kanan Dependensi dari proyek dan pilih Kelola paket NuGet.

Dengan Telusuri dipilih dari tab, ketik EntityFrameworkCore di bidang pencarian. Paket terkait Inti Kerangka Kerja Entitas muncul dalam daftar.

Mulai saat ini, saya akan menggunakan SQL Server, jadi saya akan menginstal paket berikut.

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

Mari kita instal Microsoft.EntityFrameworkCore sebagai contoh, jadi instal dua lainnya juga.

Pilih apa yang ingin Anda instal, lalu klik tombol instal. Versi memilih stabilizer terbaru.

Dialog pada dasarnya ok untuk mengklik ok.

Pasang dua lainnya juga.

Saya berpikir bahwa paket adalah sebagai berikut.

Membuat model (program) dari konfigurasi tabel database

Jika Anda ingin mengambil atau memperbarui data dari database di Entity Framework Core, Anda biasanya perlu membuat program yang merupakan model berdasarkan konfigurasi tabel. Model ini juga disebut entitas alias.

Saat Anda membuat model, kode terlebih dahulu, teknik untuk membuat tabel dalam database dari model (program), atau Ada database pertama, yang merupakan teknik untuk membuat model (program) dari tabel. Berikut adalah cara database-first sederhana untuk memprogram secara otomatis dari tabel.

Ngomong-ngomong, langkah-langkah ini ASP.NET ke The Core, sehingga Anda dapat membuatnya di aplikasi konsol atau desktop dengan cara yang sama.

Pertama, buat proyek sekali untuk memastikan tidak ada kesalahan. Jika ada kesalahan, model tidak dapat dibuat. Anda tidak perlu membuatnya jika Anda sudah memverifikasi bahwa tidak ada kesalahan.

Dari Visual Studio, buka konsol Package Manager. Jika tidak, Anda dapat membukanya dari alat, Manajer Paket NuGet, dan konsol Package Manager di menu.

Anda akan melihat jendela yang mirip dengan jendela di bawah ini, jadi pastikan bahwa Proyek Default di kanan atas adalah proyek yang ingin Anda model. (Anda harus berhati-hati jika Anda memiliki beberapa proyek)

Di bidang input, ketikkan teks berikut: Parameter bervariasi tergantung pada lingkungan, jadi silakan ubah tepat waktu ke deskripsi berikut. (terutama di mana itu ***** khususnya)

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

Yang -Provider dipenggal, seperti di kepala setiap nama, adalah nama parameter, diikuti oleh nilai parameter tersebut.

Contoh Parameter Deskripsi Parameter
Penyedia Diperbaiki di Microsoft.EntityFrameworkCore.SqlServer SQL Server. Microsoft.EntityFrameworkCore.SqlServer
Koneksi String koneksi untuk menyambungkan ke database. String koneksi dapat digunakan di aplikasi lain yang sama, jadi silakan tulis apa yang Anda tentukan sesuai dengan kineki string koneksi. Otentikasi Windows dan otentikasi SQL Server tersedia. By the way, itu hanya digunakan untuk sementara untuk membuat model, jadi Anda tidak perlu menyadari keamanan setelah aplikasi diterbitkan untuk string koneksi ini. Waspadalah terhadap melarikan diri jika Anda memiliki simbol dalam kata sandi Anda. "Sumber Data=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=********"
F Paksa timpa meski sudah ada programnya. <No >
KeluaranDir Jalur folder tempat kode keluaran. Jalur relatif dari folder proyek Model\Database
Konteks Nama kelas konteks saat menggunakan Kerangka Kerja Entitas TestDatabaseDbContext
MenggunakanDatabaseNames Jika ditentukan, nama tabel database menjadi nama kelas apa adanya. Jika tidak, kasus dan beberapa bentuk nama kelas entitas disesuaikan sesuai dengan aturan. <No >
DataAnnotations Jika ditentukan, tipe kolom secara otomatis menambahkan atribut DataAnnotation ke setiap properti. Ini agak berguna jika Anda ingin memeriksa input secara otomatis sesuai dengan jenis database. <No >

Menekan Enter untuk menjalankannya akan secara otomatis menghasilkan kode sebagai berikut:

Kode model untuk tabel Pengguna adalah sebagai berikut:

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

By the way, peringatan ditampilkan karena string koneksi terdaftar seperti dalam kode dari kelas konteks yang dihasilkan. Pastikan untuk menghapus OnConfiguring metode di kelas konteks ini setelah kode dibuat.

Mendaftarkan string koneksi

Ini ASP.NET pemrosesan khusus inti. (Jika Anda menyesuaikannya, Anda dapat menggunakannya di aplikasi .NET Core lainnya, tetapi ASP.NET Anda dapat menanganinya secara default untuk Core.)

String koneksi yang ditentukan dalam konsol Package Manager hanya digunakan untuk menghasilkan model.

String koneksi untuk menyambungkan ke database sebagai aplikasi web tercantum di appsettings.json. Jika Anda ingin mengubah tujuan database untuk disambungkan untuk setiap build atau publikasi, Anda dapat menggunakan appsetting. Ini juga dapat dicabang oleh Development.json, dll.

Selain itu, karena string koneksi di sini digunakan sebagai operasi, mari kita mengambil langkah-langkah seperti membuat pengguna koneksi menjadi pengguna khusus dengan mempertimbangkan keamanan dll.

Jika Anda mengaturnya ke appsettings.json, buat bagian ConnectionStrings di bagian root (objek, bukan bagian persis). Buat sekumpulan kunci dan nilai di dalamnya. Nama kuncinya bisa apa saja, tapi nanti akan digunakan. Nilai menentukan string koneksi.

{
  // 

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

Jadikan Entity Framework Core tersedia untuk program

Ini ASP.NET pemrosesan khusus inti. (Jika Anda menyesuaikannya, Anda dapat menggunakannya di aplikasi .NET Core lainnya, tetapi ASP.NET Anda dapat menanganinya secara default untuk Core.)

ASP.NET Core, setiap instans memiliki waktu bertahan hidup, yang berbeda dari konsol dan aplikasi desktop. Misalnya, "Sejak layanan Web dimulai sampai dihentikan" atau "sejak permintaan diterima hingga respons dikembalikan". ASP.NET Core, yang dapat ditempatkan di The Core, ServiceLifetime.Scoped ditentukan secara default. Jika tidak ada alasan khusus, Anda bisa tetap seperti ini.

Untuk memungkinkan program Anda mengakses konteks database, tambahkan Startup.ConfigureServices ke :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Argumen tipe metode menentukan kelas konteks yang Anda buat.

options.UseSqlServer Metode ini menunjukkan bahwa server sql digunakan.

Configuration.GetConnectionString("TestDatabaseDbContext") menentukan nama kunci yang terdaftar di appsettings.json.

ASP.NET kasus penggunaan di Core MVC

ASP.NET beberapa cara untuk menggunakan Entity Framework Core di Core MVC.

Tambahkan di (sisipan dependensi) ke pengontrol

Dengan mendaftarkan .cs services.AddDbContext dalam startup.cs TestDatabaseDbContext Ini dapat dimasukkan ke dalam pengontrol.

Contoh DI adalah HomeController bahwa konstruktor memiliki ILogger<HomeController> logger argumen. Hal ini ditambahkan oleh DI. Anda bisa menyisipkan TestDatabaseDbContext dengan cara yang sama.

Jika Anda HomeController ingin menambahkan ke yang sudah ada, sepertinya ini: Tentu saja, itu dapat ditambahkan ke pengontrol lain.

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

Anda kemudian dapat mengakses database dengan menggunakan contoh konteks yang diterima di setiap tindakan.

Gunakan kasus

Kode berikut adalah kode yang menangani daftar pengguna dan pendaftaran baru. Mulai sekarang pada ASP.NET, Entity Framework Core akan menjadi kode untuk masing-masing, jadi saya tidak akan menjelaskan secara rinci.

Model yang dihasilkan Framework Core entitas masih dapat digunakan sebagai model untuk tindakan. Anda juga dapat membuat model terpisah dan membungkus dan menggunakan model Inti Kerangka Kerja Entitas.

Selain itu, konteks secara otomatis dibuang ketika permintaan pengguna berakhir.

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

  // ここまで追加

  // 省略
}

Karena merepotkan untuk membuat layar secara manual, layar daftar secara otomatis dihasilkan dengan perancah.

Views/Home/List.cshtmlYang dibuat secara otomatis adalah sebagai berikut:

@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 Tambahkan link ke transisi layar ke daftar.

<!-- 省略 -->

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

Layar registrasi pengguna juga dibuat secara otomatis.

Views/Home/Create.cshtmlYang dibuat secara otomatis adalah sebagai berikut: Sulit untuk digunakan apa adanya, jadi saya telah memperbaikinya sedikit.

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

Jalankan dan konfirmasi. Ngomong-ngomong, tidak ada langkah-langkah keamanan seperti pendaftaran kata sandi, jadi silakan ikuti ASP.NET core dan database saat beroperasi.

Tentu saja, itu tercermin dalam database.

Tips ini tidak membuat pengeditan atau penghapusan, sehingga Anda dapat menggunakan edit ke perangkat yang | Detail | Hapus" juga menyebabkan kesalahan. Anda dapat membuatnya dengan cara yang sama seperti Buat, jadi cobalah. Tiga proses di atas juga telah ditambahkan ke kode sampel.

Mendapatkan konteks database dari RequestServices

Menambahkan di ke konstruktor pengontrol bisa sedikit rumit karena Anda harus menambahkannya ke semua pengontrol yang Anda butuhkan. Atau, RequestServices Anda bisa mendapatkan dari .

Ini tidak termasuk dalam kode sampel, tetapi dapat diperoleh sebagai berikut.

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

Membuat konteks database secara langsung

Ini juga digunakan dalam konsol dan aplikasi desktop. Anda dapat menggunakan metode ini tanpa masalah. Tidak disarankan karena ruang lingkup transaksi cenderung ambigu dalam aplikasi Web di mana akses simultan cenderung terjadi. Secara khusus, pembaruan mungkin tidak dapat digulirkan kembali ke basis permintaan berdasarkan permintaan berdasarkan permintaan.

Jika Anda mengakses database dengan cara DbContext ini, Anda akan menggunakan teknik untuk mendapatkan .

Pertama, Startup modifikasi untuk bekerja dengan 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 Buat kelas yang TestDatabaseDbContextEx berasal dari dan atur string koneksi appsettings.json. Jika Anda dapat mengatur string koneksi, Anda dapat mengambil metode lain, seperti melewatinya melalui konstruktor.

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

Jika Anda ingin mengakses database, hasilkan dan gunakan contoh kelas yang diturunkan.

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

ASP.NET di halaman Core Razor

ASP.NET beberapa cara untuk menggunakan Entity Framework Core pada halaman Core Razor.

Menambahkan di (sisipkan dependensi) ke model halaman

Dengan mendaftarkan .cs services.AddDbContext dalam startup.cs TestDatabaseDbContext Ini dapat disisipkan ke dalam model halaman.

Contoh DI adalah IndexModel bahwa konstruktor memiliki ILogger<IndexModel> logger argumen. Hal ini ditambahkan oleh DI. Anda bisa menyisipkan TestDatabaseDbContext dengan cara yang sama.

Jika Anda IndexModel ingin menambahkan ke yang sudah ada, sepertinya ini: Tentu saja, itu dapat ditambahkan ke model halaman lain.

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

Anda kemudian dapat mengakses database dengan menggunakan contoh konteks yang Anda terima dalam setiap proses.

Gunakan kasus

Kode berikut adalah kode yang menangani daftar pengguna dan pendaftaran baru. Baik ASP.NET Core dan Entity Framework Core akan menjadi kode, jadi saya tidak akan masuk ke detail. Selain itu, konteks secara otomatis dibuang ketika permintaan pengguna berakhir.

Membuat model halaman untuk layar daftar.

List.cshtml.cs sebagai berikut:

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 dibuat sebagai berikut:

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

Tambahkan ke Index.cshtml sehingga Anda dapat beralih ke halaman Daftar.

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

Buat layar pendaftaran pengguna juga.

Create.cshtml.cs kode sebagai berikut:

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 sebagai berikut:

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

Jalankan dan konfirmasi. Ngomong-ngomong, tidak ada langkah-langkah keamanan seperti pendaftaran kata sandi, jadi silakan ikuti ASP.NET core dan database saat beroperasi.

Tentu saja, itu tercermin dalam database.

Saya tidak membuat pengeditan atau penghapusan, jadi saya tidak ingin mengedit ke | Detail | Hapus" juga menyebabkan kesalahan. Anda dapat membuatnya dengan cara yang sama seperti Buat, jadi cobalah. Tiga proses di atas juga telah ditambahkan ke kode sampel.

Mendapatkan konteks database dari RequestServices

Menambahkan di ke konstruktor model halaman agak rumit karena Anda harus menambahkannya ke semua model halaman yang Anda butuhkan. Atau, RequestServices Anda bisa mendapatkan dari .

Ini tidak termasuk dalam kode sampel, tetapi dapat diperoleh sebagai berikut.

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

Membuat konteks database secara langsung

Ini juga digunakan dalam konsol dan aplikasi desktop. Anda dapat menggunakan metode ini tanpa masalah. Tidak disarankan karena ruang lingkup transaksi cenderung ambigu dalam aplikasi Web di mana akses simultan cenderung terjadi. Secara khusus, pembaruan mungkin tidak dapat digulirkan kembali ke basis permintaan berdasarkan permintaan berdasarkan permintaan.

Jika Anda mengakses database dengan cara DbContext ini, Anda akan menggunakan teknik untuk mendapatkan .

Pertama, Startup modifikasi untuk bekerja dengan 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 Buat kelas yang TestDatabaseDbContextEx berasal dari dan atur string koneksi appsettings.json. Jika Anda dapat mengatur string koneksi, Anda dapat mengambil metode lain, seperti melewatinya melalui konstruktor.

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

Jika Anda ingin mengakses database, hasilkan dan gunakan contoh kelas yang diturunkan.

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