ASP.NET sử dụng Ctom Putt Core để truy cập cơ sở dữ liệu trong Core

Ngày tạo trang :

môi trường

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3.1 (MVC, Trang Razor)
SQL Server
  • 2019 Express

Bắt đầu

Mẹo này cho ASP.NET sử dụng khung vật lý Core, tuân theo công nghệ cốt lõi.

Tạo cơ sở dữ liệu, sử dụng lõi khung thực thể, v.v. không phải là nội dung chính của mẹo này và do đó không có hướng dẫn chi tiết. Chúng được ASP.NET theo cùng một cách bên ngoài lõi.

Lần này, tôi đã cài đặt SQL Server trên một máy chủ khác và kết nối thông qua xác thực SQL Server. Không giống như xác thực Windows được sử dụng trong quá trình cài đặt cục bộ, chỉ có chuỗi kết nối và chương trình không khác nhau.

Tạo bảng cơ sở dữ liệu

Mẹo này sử dụng SQL Server. Cài đặt SQL Server trong môi trường địa phương hoặc trên bất kỳ máy chủ.

Nếu bạn không có cơ sở dữ liệu để kiểm tra, tạo ra một cơ sở dữ liệu.

Nếu bạn muốn tạo SQL bằng SQL, thay đổi đường dẫn phiên bản SQL Server và tên cơ sở dữ liệu dựa trên môi trường của bạn, như sau:

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

Tạo một bảng để kiểm tra. Đặt khóa chính để cập nhật hoặc xóa.

Khi được tạo ra trong 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

Thêm bản ghi để xem.

Khi bạn thêm nó trong 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 sử dụng khung thực thể ở lõi

Dự án này là phổ biến trên cả hai trang MVC và Razor.

Cài đặt gói cho lõi khung thực thể

Sau khi tạo dự án, trước tiên hãy lấy gói từ NuGet để bạn có thể sử dụng lõi khung thực thể. Lấy MVC làm ví dụ ở đây, nhưng trang Razor hoạt động như nhau.

Bấm chuột phải vào Phụ thuộc từ dự án, rồi chọn Quản lý gói NuGet.

Chọn Duyệt từ tab, sau đó nhập EntityFrameworkCore vào trường tìm kiếm Danh sách sau đó hiển thị các gói liên quan đến lõi khung thực thể.

Lần này, chúng ta sẽ sử dụng SQL Server, vì vậy chúng ta sẽ cài đặt các gói sau:

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

Chúng tôi sẽ cài đặt nó trong trường hợp của Microsoft.EntityFrameworkCore, vì vậy hãy cài đặt hai người khác theo cùng một cách.

Chọn những gì bạn muốn cài đặt, và sau đó nhấp vào nút Cài đặt. Phiên bản chọn bộ ổn định mới nhất.

Hộp thoại về cơ bản không có vấn đề, bấm OK.

Vui lòng cài đặt hai cái khác.

Tôi nghĩ rằng gói được hiển thị dưới

Tạo mô hình (chương trình) từ cấu hình bảng của cơ sở dữ liệu

Sử dụng nếu bạn muốn lấy hoặc cập nhật dữ liệu từ cơ sở dữ liệu trong lõi khung thực thể Bạn cần phải viết một chương trình thường được mô hình hóa dựa trên cấu hình bảng. Mô hình này còn được gọi là thực thể.

Khi bạn tạo một mô hình, mã đầu tiên là một kỹ thuật để tạo ra một bảng cơ sở dữ liệu từ một mô hình (chương trình). Ưu tiên cơ sở dữ liệu là một kỹ thuật để tạo ra một mô hình (chương trình) từ một bảng. Phần này mô tả cách tự động lập trình bằng cách sử dụng bảng ưu tiên cơ sở dữ liệu dễ thực hiện.

Nhân tiện, ASP.NET các bước này không liên quan đến lõi, vì vậy bạn có thể tạo các bước này theo cách tương tự trong bảng điều khiển hoặc ứng dụng dành cho máy tính để bàn.

Đầu tiên, xây dựng dự án một lần để đảm bảo rằng không có lỗi. Nếu xảy ra lỗi, bạn không thể tạo mô hình. Nếu bạn đã xác minh rằng không có lỗi, bạn không cần phải xây dựng nó.

Mở bảng điều khiển quản lý gói từ Visual Studio. Nếu không, hãy mở nó từ Công cụ, Trình quản lý gói NuGet và Bảng điều khiển Quản lý Gói trong menu.

Một cửa sổ được hiển thị dưới đây, vì vậy hãy chắc chắn rằng mục mặc định ở góc trên bên phải là mục mà bạn muốn tạo mô hình. (Nếu bạn có nhiều mục, bạn cần phải cẩn thận)

Nhập văn bản sau vào trường đầu vào. Các tham số khác nhau tùy thuộc vào môi trường, vì vậy hãy thay đổi chúng một cách kịp thời theo các hướng dẫn sau. (đặc biệt là các bộ phận của ****** )

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

Tiêu đề của mỗi -Provider tên có dấu gạch nối, chẳng hạn như tên đối số, theo sau là giá trị tham số.

dụ tham
Tham số Mô tả Vísố
Provider Được cố định trong SQL Microsoft.EntityFrameworkCore.SqlServer Server. Microsoft.EntityFrameworkCore.SqlServer
Connection Chuỗi kết nối được sử dụng để kết nối với cơ sở dữ liệu Bởi vì chuỗi kết nối cũng phổ biến trong các ứng dụng khác, mô tả những gì bạn muốn chỉ định dựa trên ký hiệu của chuỗi kết nối. Nó có sẵn cho windows và SQL Server xác thực. Nhân tiện, nó chỉ được sử dụng để tạo mô hình, vì vậy bạn không phải lo lắng về tính bảo mật của chuỗi kết nối này sau khi ứng dụng được phát hành. Nếu mật khẩu của bạn chứa các biểu tượng, hãy chú ý đến việc hiển thị "Data Source=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=**********"
f Buộc ghi đè chương trình, ngay cả khi chương trình đã tồn tại. <Không >
OutputDir Đường dẫn thư mục để in mã. Đường dẫn đến thư mục dự án Models\Database
Context Tên lớp ngữ cảnh khi sử dụng khung thực thể TestDatabaseDbContext
UseDatabaseNames Nếu được chỉ định, tên bảng của cơ sở dữ liệu sẽ trở thành tên lớp như là. Nếu không được chỉ định, trường hợp và số nhiều của tên lớp thực thể được điều chỉnh theo quy tắc. <Không >
DataAnnotations Nếu được chỉ định, loại cột sẽ tự động đính kèm thuộc tính DataAnnotation vào mỗi thuộc tính. Điều này là một chút thuận tiện nếu bạn muốn tự động kiểm tra đầu vào dựa trên loại cơ sở dữ liệu. <Không >

Khi bạn nhấn Enter, mã sẽ tự động được tạo như sau:

Mã mô hình cho bảng người dùng trông như thế này:

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

Bằng cách này, cảnh báo được thực hiện bởi vì nó liệt kê các chuỗi kết nối như là trong mã lớp ngữ cảnh được tạo ra. Hãy chắc chắn OnConfiguring rằng bạn loại bỏ các phương pháp của lớp ngữ cảnh này sau khi mã được tạo ra

Đăng ký chuỗi kết nối

Đây là ASP.NET cụ thể cho Core. (Bạn có thể tùy chỉnh nó để sử dụng với các ứng dụng .NET Core khác ASP.NET, theo mặc định, nó có thể được sử dụng cho lõi)

Chuỗi kết nối được chỉ định trong bảng điều khiển quản lý gói chỉ được sử dụng để xây dựng mô hình.

Chuỗi kết nối được kết nối với cơ sở dữ liệu dưới dạng ứng dụng web được cung cấp trong appsettings.json. Sử dụng appsettings nếu bạn muốn thay đổi mục tiêu cơ sở dữ liệu được kết nối mỗi khi bạn xây dựng hoặc xuất bản. Bạn cũng có thể sử dụng Development.json, v.v. để phân nhánh.

Ngoài ra, bởi vì chuỗi kết nối này được sử dụng như một hoạt động, thực hiện các bước như kết nối người dùng chuyên dụng, xem xét bảo mật, v.v.

Nếu bạn đặt thành appsettings.json, hãy tạo phần ConnectionStrings trong phần gốc (được gọi chính xác là đối tượng, không phải phần). Tạo một tập hợp các khóa và giá trị trong đó. Tên của khóa không quan trọng, nhưng được sử dụng sau. Giá trị này là một chuỗi kết nối.

{
  // 

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

Làm cho khung thực thể Core có sẵn cho chương trình

Đây là ASP.NET cụ thể cho Core. (Bạn có thể tùy chỉnh nó để sử dụng với các ứng dụng .NET Core khác ASP.NET, theo mặc định, nó có thể được sử dụng cho lõi)

ASP.NET lõi không giống như bảng điều khiển và ứng dụng dành cho máy tính để bàn, mỗi phiên bản có một cuộc sống. Ví dụ: "Bắt đầu từ dịch vụ Web đến dừng lại" hoặc "Từ khi nhận được yêu cầu đến phản hồi trả về". ASP.NET, theo mặc định, khung thực thể Core có thể được đặt ServiceLifetime.Scoped trong Core. Nếu không có lý do đặc biệt, bạn có thể ở lại như nó được.

Để cho phép chương trình truy cập vào ngữ cảnh cơ sở dữ liệu, Startup.ConfigureServices thêm nó vào như sau:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Tham số loại của phương pháp xác định lớp ngữ cảnh được tạo ra.

options.UseSqlServer Phương pháp hướng dẫn sử dụng SQL Server.

Configuration.GetConnectionString("TestDatabaseDbContext") Chỉ rõ tên khóa đã đăng ký trong appsettings.json.

ASP.NET mẫu trong Core MVC

ASP.NET cách để sử dụng Imat Paint Put On Paint Core trong Core MVC.

Thêm vào bộ điều khiển bằng CÁCH sử dụng DI (chèn phụ thuộc).

Đăng ký .cs services.AddDbContext bằng cách sử dụng phương pháp Startup TestDatabaseDbContext Có thể được cắm vào bộ điều khiển.

Một ví dụ về DI HomeController là các nhà xây dựng như là một ILogger<HomeController> logger đối số. Đây là những gì DI thêm vào. Bạn cũng TestDatabaseDbContext có thể chèn theo cùng một cách.

Nếu bạn HomeController muốn thêm hiện có vào: Tất nhiên, bạn có thể thêm nó vào bộ điều khiển khác.

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

Cơ sở dữ liệu sau đó được truy cập bằng cách sử dụng các trường hợp của bối cảnh nhận được trong mỗi hoạt động.

Sử dụng ví dụ

Mã sau đây xử lý danh sách người dùng và đăng ký mới. Trước đó là ASP.NET core, khung thực thể Core, vì vậy chi tiết được bỏ qua.

Mô hình được tạo ra bởi lõi khung thực thể có thể được sử dụng làm mô hình cho các hoạ Bạn có thể tạo các mô hình riêng biệt và đóng gói các mô hình cốt lõi của khung thực thể.

Ngoài ra, khi yêu cầu của người dùng kết thúc, ngữ cảnh sẽ tự động bị phá hủy

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

  // ここまで追加

  // 省略
}

Sử dụng giàn giáo để tự động tạo màn hình danh sách vì việc tạo màn hình theo cách thủ công là rắc rối.

Tự động Views/Home/List.cshtml tạo ra như sau:

@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 Thêm liên kết chuyển đổi màn hình vào danh sách.

<!-- 省略 -->

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

Màn hình đăng ký người dùng cũng được tạo tự động.

Tự động Views/Home/Create.cshtml tạo ra như sau: Bởi vì nó là, nó là khó khăn để sử dụng, vì vậy nó sửa chữa một chút.

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

Chạy nó và kiểm tra nó. Nhân tiện, vì không có biện pháp bảo mật, chẳng hạn như đăng ký mật khẩu, hãy làm theo ASP.NET Core và kỹ thuật đăng ký cơ sở dữ liệu khi hoạt động.

Tất nhiên, nó được phản ánh trong cơ sở dữ liệu.

Bởi vì lời nhắc này không tạo ra một quá trình chỉnh sửa hoặc xóa, chỉnh sửa ở | Details | Nếu bạn bấm Xóa, một lỗi sẽ xảy ra. Bạn có thể tạo nó như thể bạn đã tạo nó, vì vậy hãy thử nó. Mã mẫu cũng chứa ba thủ tục trên.

Nhận ngữ cảnh cơ sở dữ liệu từ RequestServices

Điều này là một chút rắc rối khi thêm vào các nhà xây dựng bộ điều khiển trong DI bởi vì tất cả các bộ điều khiển cần thiết phải được thêm vào. Một cách khác là RequestServices lấy nó từ nó.

Nó không được bao gồm trong mã mẫu, nhưng có thể được lấy như sau:

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

Tạo bối cảnh cơ sở dữ liệu trực tiếp

Công nghệ này cũng được sử dụng trong các ứng dụng giao diện điều khiển và máy tí Điều này có thể được sử dụng mà không có bất kỳ vấ Điều này không được khuyến khích bởi vì phạm vi giao dịch có thể dễ dàng bị mờ trong các ứng dụng Web với một số lượng lớn các truy cập đồng thời. Đặc biệt, hệ thống cập nhật có thể không thể quay trở lại đơn vị yêu cầu.

Kỹ thuật có nguồn gốc được sử dụng khi DbContext truy cập cơ sở dữ liệu theo cách này.

Đầu Startup Configuration tiên, sửa static đổi nó để nó có thể được xử lý trong .

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

  // 省略
}

TestDatabaseDbContext Tạo một TestDatabaseDbContextEx lớp có nguồn gốc và thiết lập chuỗi kết nối cho appsettings.json. Nếu bạn có thể thiết lập chuỗi kết nối, bạn có thể thực hiện các hành động khác, chẳng hạn như vượt qua chuỗi kết nối thông qua các nhà xây dựng.

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

Nếu bạn muốn truy cập vào cơ sở dữ liệu, xây dựng và sử dụng các trường hợp của các lớp học có nguồn gốc.

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

ASP.NET mẫu trên trang Core Razor

ASP.NET có nhiều cách để sử dụng Itac Paint Put On Core trên trang Core Razor.

Sử dụng DI (chèn phụ thuộc) để thêm vào mô hình trang

Đăng ký .cs services.AddDbContext bằng cách sử dụng phương pháp Startup TestDatabaseDbContext Có thể được chèn vào mô hình trang.

Một ví dụ về DI IndexModel là các nhà xây dựng như là một ILogger<IndexModel> logger đối số. Đây là những gì DI thêm vào. Bạn cũng TestDatabaseDbContext có thể chèn theo cùng một cách.

Nếu bạn IndexModel muốn thêm hiện có vào: Tất nhiên, nó cũng có thể được thêm vào các mô hình trang khác.

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

Cơ sở dữ liệu sau đó được truy cập bằng cách sử dụng các trường hợp của bối cảnh nhận được trong mỗi hoạt động.

Sử dụng ví dụ

Mã sau đây xử lý danh sách người dùng và đăng ký mới. Cả hai ASP.NET trong Core và Itami Put Put Core, do đó bỏ qua các chi tiết chi tiết. Ngoài ra, khi yêu cầu của người dùng kết thúc, ngữ cảnh sẽ tự động bị phá hủy

Tạo mô hình trang cho màn hình danh sách.

Đặt list.cshtml .cs như sau:

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

Tạo List.cshtml như sau:

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

Thêm vào Index.cshtml để bạn có thể truy cập trang Danh sách.

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

Tạo màn hình đăng ký người dùng.

Tạo mã .cs Create.cshtml như sau:

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

Tạo Create.cshtml như sau:

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

Chạy nó và kiểm tra nó. Nhân tiện, vì không có biện pháp bảo mật, chẳng hạn như đăng ký mật khẩu, hãy làm theo ASP.NET Core và kỹ thuật đăng ký cơ sở dữ liệu khi hoạt động.

Tất nhiên, nó được phản ánh trong cơ sở dữ liệu.

Vì bạn chưa tạo quy trình chỉnh sửa hoặc xóa, quy trình chỉnh sửa ở bên phải danh sách | Details | Nếu bạn bấm Xóa, một lỗi sẽ xảy ra. Bạn có thể tạo nó như thể bạn đã tạo nó, vì vậy hãy thử nó. Mã mẫu cũng chứa ba thủ tục trên.

Nhận ngữ cảnh cơ sở dữ liệu từ RequestServices

Điều này là một chút rắc rối khi thêm các nhà xây dựng vào mô hình trang trong DI bởi vì tất cả các mô hình trang cần thiết phải được thêm vào. Một cách khác là RequestServices lấy nó từ nó.

Nó không được bao gồm trong mã mẫu, nhưng có thể được lấy như sau:

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

Tạo bối cảnh cơ sở dữ liệu trực tiếp

Công nghệ này cũng được sử dụng trong các ứng dụng giao diện điều khiển và máy tí Điều này có thể được sử dụng mà không có bất kỳ vấ Điều này không được khuyến khích bởi vì phạm vi giao dịch có thể dễ dàng bị mờ trong các ứng dụng Web với một số lượng lớn các truy cập đồng thời. Đặc biệt, hệ thống cập nhật có thể không thể quay trở lại đơn vị yêu cầu.

Kỹ thuật có nguồn gốc được sử dụng khi DbContext truy cập cơ sở dữ liệu theo cách này.

Đầu Startup Configuration tiên, sửa static đổi nó để nó có thể được xử lý trong .

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

  // 省略
}

TestDatabaseDbContext Tạo một TestDatabaseDbContextEx lớp có nguồn gốc và thiết lập chuỗi kết nối cho appsettings.json. Nếu bạn có thể thiết lập chuỗi kết nối, bạn có thể thực hiện các hành động khác, chẳng hạn như vượt qua chuỗi kết nối thông qua các nhà xây dựng.

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

Nếu bạn muốn truy cập vào cơ sở dữ liệu, xây dựng và sử dụng các trường hợp của các lớp học có nguồn gốc.

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