ASP.NET pangkalan data dengan menggunakan Teras Rangka Kerja Entiti dalam Teras

Tarikh penciptaan halaman :

Persekitaran

Visual Studio
  • Studio Visual 2019
ASP.NET Teras
  • 3.1 (MVC, laman Cukur)
Pelayan SQL
  • Ekspres 2019

Pada mulanya

Petua ini ASP.NET langkah-langkah untuk menggunakan Teras Kerangka Entiti menggunakan pendekatan Teras Berikut.

Mencipta pangkalan data, menggunakan Teras Kerangka Entiti, dan sebagainya bukan fokus utama petua ini, jadi kami tidak akan pergi ke butiran. Mereka ASP.NET dengan cara yang sama di luar Teras.

Kali ini, pelayan sql dipasang pada pelayan lain dan disambungkan oleh pengesahan SQL Server. Satu-satunya perbezaan daripada pengesahan Windows yang digunakan semasa pemasangan tempatan adalah rentetan sambungan, dan tidak ada perbezaan dalam atur cara itu.

Cipta jadual pangkalan data

Petua ini menggunakan Pelayan SQL. Pasang Pelayan SQL dalam persekitaran tempatan anda atau pada mana-mana pelayan.

Jika anda tidak mempunyai pangkalan data untuk ujian, cipta pangkalan data.

Jika anda mencipta SQL, seperti berikut, tukar laluan versi Pelayan SQL dan nama pangkalan data untuk disesuaikan dengan persekitaran 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

Cipta jadual untuk ujian. Set kekunci utama untuk pengemaskinian dan penghapusan.

Jika anda ingin menciptanya dalam 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

Tambah rekod untuk paparan.

Jika anda mahu menambahnya dalam 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 entiti yang terdapat dalam Teras

Item ini adalah perkara biasa untuk kedua-dua halaman MVC dan Cukur.

Pemasangan pakej Rangka Kerja Entiti Teras

Sebaik sahaja anda telah mencipta projek anda, dapatkan pakej dari NuGet supaya anda boleh menggunakan Teras Kerangka Entiti terlebih dahulu. MVC adalah contoh, tetapi operasinya sama di halaman cukur.

Klik kanan Kebergantungan daripada projek dan pilih Uruskan pakej NuGet.

Dengan Semak Lalu yang dipilih daripada tab, taipkan EntityFrameworkCore dalam medan carian. Pakej berkaitan teras Rangka Kerja Entiti muncul dalam senarai.

Dari masa ini, saya akan menggunakan SQL Server, jadi saya akan memasang pakej berikut.

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

Mari kita pasang Microsoft.EntityFrameworkCore sebagai contoh, jadi pasang dua yang lain juga.

Pilih apa yang anda mahu pasang, dan kemudian klik butang pasang. Versi ini memilih penstabil terkini.

Dialog pada dasarnya ok untuk klik ok.

Pasang dua yang lain juga.

Saya berfikir bahawa pakej adalah seperti berikut.

Cipta model (atur cara) daripada konfigurasi jadual pangkalan data

Jika anda ingin mendapatkan atau mengemaskini data dari pangkalan data dalam Teras Kerangka Entiti, Anda biasanya perlu mencipta atur cara yang merupakan model berdasarkan konfigurasi jadual. Model ini juga dipanggil entiti alias.

Apabila anda mencipta model, kod terlebih dahulu, teknik untuk mencipta jadual dalam pangkalan data daripada model (program), atau Terdapat pangkalan data pertama, yang merupakan teknik untuk mencipta model (program) dari jadual. Berikut adalah cara pertama pangkalan data yang mudah untuk program secara automatik dari jadual.

Dengan cara ini, langkah-langkah ini ASP.NET kepada Teras, jadi anda boleh menciptanya dalam aplikasi konsol atau desktop dengan cara yang sama.

Pertama, bina projek sekali untuk pastikan tidak ada kesilapan. Jika terdapat ralat, model tidak boleh dicipta. Anda tidak perlu membinanya jika anda telah mengesahkan bahawa tiada ralat.

Dari Visual Studio, buka konsol Pengurus Pakej. Jika tidak, anda boleh membukanya daripada alat, Pengurus Pakej NuGet dan konsol Pengurus Pakej dalam menu.

Anda akan melihat tetingkap yang serupa dengan yang di bawah, jadi pastikan Projek Lalai di bahagian atas kanan adalah projek yang anda mahu model. (Anda perlu berhati-hati jika anda mempunyai beberapa projek)

Dalam medan input, taipkan teks berikut: Parameter berbeza-beza bergantung kepada alam sekitar, jadi sila ubahnya tepat pada masanya kepada perihalan berikut. (terutamanya di mana ia ***** 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 hyphenated, seperti di kepala setiap nama, adalah nama parameter, diikuti dengan nilai parameter itu.

Contoh Parameter Penerangan Parameter
Pembekal Ditetapkan dalam Microsoft.EntityFrameworkCore.SqlServer Pelayan SQL. Microsoft.EntityFrameworkCore.SqlServer
Sambungan Rentetan sambungan untuk menyambung ke pangkalan data. Rentetan sambungan boleh digunakan dalam aplikasi lain yang sama, jadi sila tulis apa yang anda tentukan mengikut rentetan sambungan kineki. Pengesahan Windows dan pengesahan Pelayan SQL tersedia. Dengan cara ini, ia hanya digunakan buat sementara waktu untuk mencipta model, jadi anda tidak perlu menyedari keselamatan selepas aplikasi diterbitkan untuk rentetan sambungan ini. Berhati-hati dengan melarikan diri jika anda mempunyai simbol dalam kata laluan anda. "Sumber Data=ServerName\SQLEXPRESS;Pangkalan Data=TestDatabase;id pengguna=Nama Pengguna;kata laluan=******""
F Paksa tulis ganti walaupun sudah ada atur cara. >lt;Tidak >
OutputDir Laluan folder yang mana kod itu dikeluarkan. Laluan relatif dari folder projek Model\Pangkalan Data
Konteks Konteks nama kelas apabila menggunakan Rangka Kerja Entiti TestDatabaseDbContext
UseDatabaseNames Jika ditentukan, nama jadual pangkalan data menjadi nama kelas seperti itu. Jika tidak, kes dan pelbagai bentuk nama kelas entiti diselaraskan mengikut peraturan. >lt;Tidak >
DataAnnotations Jika ditentukan, jenis lajur secara automatik ditambah atribut DataAnnotation kepada setiap hartanah. Ini agak berguna jika anda ingin menyemak input secara automatik mengikut jenis pangkalan data. >lt;Tidak >

Menekan Enter untuk menjalankannya secara automatik akan menjana kod seperti berikut:

Kod model untuk jadual Pengguna adalah seperti 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; }
}

Dengan cara ini, amaran dipaparkan kerana rentetan sambungan disenaraikan kerana ia berada dalam kod kelas konteks yang dijana. Pastikan untuk OnConfiguring memadam kaedah dalam kelas konteks ini selepas kod dijana.

Daftar rentetan sambungan

Ini ASP.NET khusus teras. (Jika anda menyesuaikannya, anda boleh menggunakannya dalam aplikasi .NET Core yang lain, tetapi ASP.NET boleh mengendalikannya secara lalai untuk Teras.)

Rentetan sambungan yang ditentukan dalam konsol Pengurus Pakej hanya digunakan untuk menjana model.

Rentetan sambungan untuk menyambung ke pangkalan data sebagai aplikasi web disenaraikan dalam appsettings.json. Jika anda ingin menukar destinasi pangkalan data untuk menyambung kepada setiap binaan atau penerbitan, anda boleh menggunakan appsettings. Ia juga boleh dicabangkan oleh Development.json, dll.

Di samping itu, kerana rentetan sambungan di sini digunakan sebagai operasi, mari kita mengambil langkah-langkah seperti menjadikan pengguna sambungan pengguna berdedikasi dalam pertimbangan keselamatan dan sebagainya.

Jika anda menetapkannya ke appsettings.json, cipta bahagian ConnectionStrings dalam bahagian akar (objek, bukan seksyen yang tepat). Cipta satu set kekunci dan nilai di dalamnya. Nama kunci boleh menjadi apa-apa, tetapi ia akan digunakan kemudian. Nilai menentukan rentetan sambungan.

{
  // 

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

Jadikan Teras Rangka Kerja Entiti tersedia untuk atur cara

Ini ASP.NET khusus teras. (Jika anda menyesuaikannya, anda boleh menggunakannya dalam aplikasi .NET Core yang lain, tetapi ASP.NET boleh mengendalikannya secara lalai untuk Teras.)

ASP.NET Teras, setiap contoh mempunyai masa hidup, yang berbeza daripada konsol dan aplikasi desktop. Sebagai contoh, "Dari masa perkhidmatan Web dimulakan sehingga ia dihentikan" atau "dari masa permintaan diterima sehingga respons dikembalikan". ASP.NET rangka kerja, yang boleh diletakkan dalam Teras, ServiceLifetime.Scoped menentukan secara lalai. Jika tiada sebab istimewa, anda boleh kekal dengan cara ini.

Untuk membenarkan atur cara anda mengakses konteks pangkalan data, Startup.ConfigureServices tambahkannya 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> Hujah jenis kaedah menentukan kelas konteks yang anda cipta.

options.UseSqlServer Kaedah ini menunjukkan bahawa pelayan sql digunakan.

Configuration.GetConnectionString("TestDatabaseDbContext") menentukan nama utama yang didaftarkan dengan appsettings.json.

ASP.NET guna dalam Teras MVC

ASP.NET beberapa cara untuk menggunakan Teras Kerangka Entiti dalam Teras MVC.

Tambah di (masukkan pergantungan) kepada pengawal

Dengan mendaftar .cs services.AddDbContext dalam permulaan.cs TestDatabaseDbContext Ia boleh dimasukkan ke dalam pengawal.

Contoh DI HomeController ialah pembangkit mempunyai ILogger<HomeController> logger hujah. Ini ditambah oleh DI. Anda boleh menyenyapkan TestDatabaseDbContext dengan cara yang sama.

Jika HomeController anda mahu menambah ke yang sedia ada, ia kelihatan seperti ini: Sudah tentu, ia boleh ditambah kepada pengawal 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 kemudiannya boleh mengakses pangkalan data dengan menggunakan contoh konteks yang diterima dalam setiap tindakan.

Guna kes

Kod berikut adalah kod yang mengendalikan penyenaraian pengguna dan pendaftaran baru. Mulai sekarang ASP.NET teras, Teras Rangka Kerja Entiti akan menjadi kod untuk setiap, jadi saya tidak akan menerangkan secara terperinci.

Model teras Rangka Kerja Entiti masih boleh digunakan sebagai model untuk tindakan. Anda juga boleh mencipta model dan balut yang berasingan dan menggunakan model Teras Kerangka Entiti.

Juga, konteks dibuang secara automatik apabila 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));
  }

  // ここまで追加

  // 省略
}

Oleh kerana ia menyusahkan untuk mencipta skrin secara manual, skrin senarai dijana secara automatik oleh perancah.

Views/Home/List.cshtmlAuto-dijana adalah seperti 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 Tambah pautan ke peralihan skrin ke senarai.

<!-- 省略 -->

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

Skrin pendaftaran pengguna juga dijana secara automatik.

Views/Home/Create.cshtmlAuto-dijana adalah seperti berikut: Ia adalah sukar untuk digunakan seperti itu, jadi saya telah membetulkannya 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 sahkan. Dengan cara ini, tiada langkah keselamatan seperti pendaftaran kata laluan, jadi sila ikuti kaedah pendaftaran ASP.NET Teras dan pangkalan data semasa beroperasi.

Sudah tentu, ia ditunjukkan dalam pangkalan data.

Petua ini tidak mencipta edit atau penghapusan, supaya anda boleh menggunakan edit ke | Maklumat | Padam" juga menyebabkan ralat. Anda boleh menciptanya dengan cara yang sama seperti Buat, jadi cubalah. Tiga proses di atas juga telah ditambah ke kod sampel.

Dapatkan konteks pangkalan data daripada RequestServices

Menambah di kepada pemula pengawal boleh sedikit rumit kerana anda perlu menambahnya kepada semua pengawal yang anda perlukan. Sebagai alternatif, RequestServices anda boleh mendapatkan dari .

Ia tidak termasuk dalam kod sampel, tetapi ia boleh diperolehi seperti berikut.

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

Cipta konteks pangkalan data secara langsung

Ia juga digunakan dalam konsol dan aplikasi desktop. Anda boleh menggunakan kaedah ini tanpa sebarang masalah. Ia tidak disyorkan kerana skop transaksi cenderung samar-samar dalam aplikasi Web di mana akses serentak mungkin berlaku. Khususnya, pengemaskinian mungkin tidak dapat dilancarkan semula kepada asas permintaan oleh permintaan.

Jika anda mengakses pangkalan data dengan cara DbContext ini, anda akan menggunakan teknik untuk berasal .

Pertama, Startup ubah suai 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 Cipta kelas TestDatabaseDbContextEx yang diperoleh daripada dan tetapkan rentetan sambungan appsettings.json. Jika anda boleh menetapkan rentetan sambungan, anda boleh mengambil kaedah lain, seperti melepasinya melalui pembangkit.

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 pangkalan data, hasilkan dan gunakan contoh kelas yang diperolehi.

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

ASP.NET contoh pada halaman Teras Cukur

ASP.NET beberapa cara untuk menggunakan Teras Kerangka Entiti pada halaman Teras Cukur.

Tambah di (masukkan pergantungan) ke model halaman

Dengan mendaftar .cs services.AddDbContext dalam permulaan.cs TestDatabaseDbContext Ia boleh dimasukkan ke dalam model halaman.

Contoh DI IndexModel ialah pembangkit mempunyai ILogger<IndexModel> logger hujah. Ini ditambah oleh DI. Anda boleh menyenyapkan TestDatabaseDbContext dengan cara yang sama.

Jika IndexModel anda mahu menambah ke yang sedia ada, ia kelihatan seperti ini: Sudah tentu, ia boleh ditambah 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 kemudiannya boleh mengakses pangkalan data dengan menggunakan contoh konteks yang anda terima dalam setiap proses.

Guna kes

Kod berikut adalah kod yang mengendalikan penyenaraian pengguna dan pendaftaran baru. Kedua ASP.NET Teras dan Entiti Rangka Kerja akan menjadi kod, jadi saya tidak akan pergi ke butiran. Juga, konteks dibuang secara automatik apabila permintaan pengguna berakhir.

Cipta model halaman untuk skrin senarai.

List.cshtml.cs seperti 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 dicipta seperti 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>

Tambahkannya ke Index.cshtml supaya anda boleh beralih ke halaman Senarai.

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

Cipta skrin pendaftaran pengguna juga.

Create.cshtml.cs kod seperti 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 seperti 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 sahkan. Dengan cara ini, tiada langkah keselamatan seperti pendaftaran kata laluan, jadi sila ikuti kaedah pendaftaran ASP.NET Teras dan pangkalan data semasa beroperasi.

Sudah tentu, ia ditunjukkan dalam pangkalan data.

Saya tidak mencipta sebarang edit atau penghapusan, jadi saya tidak mahu mengedit untuk | Maklumat | Padam" juga menyebabkan ralat. Anda boleh menciptanya dengan cara yang sama seperti Buat, jadi cubalah. Tiga proses di atas juga telah ditambah ke kod sampel.

Dapatkan konteks pangkalan data daripada RequestServices

Menambah di kepada pembangun model halaman agak rumit kerana anda perlu menambahnya ke semua model halaman yang anda perlukan. Sebagai alternatif, RequestServices anda boleh mendapatkan dari .

Ia tidak termasuk dalam kod sampel, tetapi ia boleh diperolehi seperti berikut.

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

Cipta konteks pangkalan data secara langsung

Ia juga digunakan dalam konsol dan aplikasi desktop. Anda boleh menggunakan kaedah ini tanpa sebarang masalah. Ia tidak disyorkan kerana skop transaksi cenderung samar-samar dalam aplikasi Web di mana akses serentak mungkin berlaku. Khususnya, pengemaskinian mungkin tidak dapat dilancarkan semula kepada asas permintaan oleh permintaan.

Jika anda mengakses pangkalan data dengan cara DbContext ini, anda akan menggunakan teknik untuk berasal .

Pertama, Startup ubah suai 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 Cipta kelas TestDatabaseDbContextEx yang diperoleh daripada dan tetapkan rentetan sambungan appsettings.json. Jika anda boleh menetapkan rentetan sambungan, anda boleh mengambil kaedah lain, seperti melepasinya melalui pembangkit.

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 pangkalan data, hasilkan dan gunakan contoh kelas yang diperolehi.

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