코어의 엔터티 프레임워크 코어를 사용하여 데이터베이스를 ASP.NET

페이지 생성 날짜 :

환경

비주얼 스튜디오
  • 비주얼 스튜디오 2019
ASP.NET 코어
  • 3.1 (MVC, 면도기 페이지)
SQL 서버
  • 2019 익스프레스

처음에

이 팁은 다음 핵심 방법을 사용하여 엔터티 프레임워크 코어를 사용하는 단계를 ASP.NET.

엔터티 프레임워크 코어를 사용하여 데이터베이스를 만드는 것은 이 팁의 주요 초점이 아니므로 세부 정보로 이동하지 않습니다. 코어 외부에서 동일한 방식으로 ASP.NET 사용됩니다.

이번에는 SQL 서버가 다른 서버에 설치되고 SQL Server 인증으로 연결됩니다. 로컬 설치 중에 사용되는 Windows 인증의 유일한 차이점은 연결 문자열이며 프로그램에 차이가 없습니다.

데이터베이스 테이블 만들기

이 팁은 SQL Server를 사용합니다. 로컬 환경이나 서버에 SQL Server를 설치합니다.

테스트를 위한 데이터베이스가 없는 경우 데이터베이스를 만듭니다.

다음과 같은 SQL에서 만드는 경우 환경에 맞게 SQL Server 버전 경로 및 데이터베이스 이름을 변경합니다.

USE [master]
GO

CREATE DATABASE [TestDatabase]
  CONTAINMENT = NONE
  ON  PRIMARY 
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
  LOG ON 
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
  WITH CATALOG_COLLATION = DATABASE_DEFAULT
GO

테스트를 위한 테이블을 만듭니다. 업데이트 및 삭제에 대한 기본 키를 설정합니다.

SQL에서 만들려면 다음을 수행합니다.

USE [TestDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[User](
  [ID] [int] NOT NULL,
  [Name] [nvarchar](20) NOT NULL,
  [Password] [nvarchar](20) NOT NULL,
  [Age] [int] NULL,
  [Email] [nvarchar](200) NULL,
  [Birthday] [date] NULL,
  [UpdateDateTime] [datetime2](7) NULL,
  CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
  [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

디스플레이에 대한 레코드를 추가합니다.

SQL에 추가하려면 다음을 수행합니다.

USE [TestDatabase]
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (1, N'氏名1', N'aaaa', 20, N'aaaa@example.com', CAST(N'2020-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (2, N'氏名2', N'bbbb', 30, N'bbbb@example.com', CAST(N'2010-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO

코어에서 사용할 수 있는 ASP.NET 엔터티 프레임워크

이 항목은 MVC 및 Razor 페이지 모두에서 일반적입니다.

엔티티 프레임워크 코어 패키지 설치

프로젝트를 만든 후에는 NuGet에서 패키지를 사용하여 엔터티 프레임워크 코어를 먼저 사용할 수 있습니다. MVC는 예제이지만 면도기 페이지에서 작업은 동일합니다.

프로젝트에서 종속성을 마우스 오른쪽 단추로 클릭하고 NuGet 관리 패키지를 선택합니다.

탭에서 선택한 찾아보기를 사용하여 검색 필드에 EntityFrameworkCore를 입력합니다. 엔터티 프레임워크 코어 관련 패키지가 목록에 나타납니다.

이 때부터 SQL Server를 사용하므로 다음 패키지를 설치합니다.

  • 마이크로소프트.엔티티 프레임 워크 코어
  • 마이크로소프트.엔티티 프레임 워크 코어.도구
  • 마이크로소프트.엔티티 프레임 워크 코어.SqlServer

예를 들어 Microsoft.EntityFrameworkCore를 설치하여 다른 두 개도 설치해 보겠습니다.

설치할 것을 선택한 다음 설치 버튼을 클릭합니다. 버전에서 최신 안정기(안정기)를 선택합니다.

대화 상자는 기본적으로 확인을 클릭 해도 괜찮습니다.

다른 두 개도 설치합니다.

나는 패키지가 다음과 같다고 생각합니다.

데이터베이스 테이블 구성에서 모델(프로그램) 만들기

엔터티 프레임워크 코어의 데이터베이스에서 데이터를 검색하거나 업데이트하려면 일반적으로 테이블 구성을 기반으로 하는 모델인 프로그램을 만들어야 합니다. 이 모델을 별칭 엔터티라고도 합니다.

모델을 만들 때 먼저 코드, 모델(프로그램)에서 데이터베이스에서 테이블을 만드는 기술 또는 먼저 데이터베이스가 있는데, 이는 테이블에서 모델(프로그램)을 만드는 기술입니다. 다음은 테이블에서 자동으로 프로그래밍하는 간단한 데이터베이스 우선 방법입니다.

즉, 이러한 단계는 코어에 ASP.NET, 그래서 당신은 같은 방법으로 콘솔 또는 데스크톱 응용 프로그램에서 만들 수 있습니다.

먼저 프로젝트를 한 번 빌드하여 오류가 없는지 확인합니다. 오류가 있는 경우 모델을 만들 수 없습니다. 오류가 없음을 이미 확인한 경우 빌드할 필요가 없습니다.

비주얼 스튜디오에서 패키지 관리자 콘솔을 엽니다. 그렇지 않으면 메뉴의 도구, NuGet 패키지 관리자 및 패키지 관리자 콘솔에서 열 수 있습니다.

아래와 비슷한 창이 표시되므로 오른쪽 상단에 있는 기본 프로젝트가 모델링할 프로젝트인지 확인합니다. (여러 프로젝트가 있는 경우 주의해야 합니다.)

입력 필드에 다음 텍스트를 입력합니다. 매개 변수는 환경에 따라 다르므로 다음 설명으로 적시에 변경하십시오. (특히 *****의 경우)

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

각 이름의 헤드와 같이 하이픈이 있는 -Provider 하나는 매개 변수 이름이며 그 다음에 는 해당 매개 변수의 값입니다.

매개
매개 변수 설명변수 예제
공급자 SQL Microsoft.EntityFrameworkCore.SqlServer 서버에서 수정되었습니다. 마이크로소프트.엔티티 프레임 워크 코어.SqlServer
연결 데이터베이스에 연결하기 위한 연결 문자열입니다. 연결 문자열은 다른 앱에서 공통으로 사용할 수 있으므로 연결 문자열 kineki에 따라 지정한 내용을 작성하십시오. Windows 인증과 SQL Server 인증을 모두 사용할 수 있습니다. 그런데 일시적으로 모델을 만드는 데만 사용되므로 이 연결 문자열에 대해 앱이 게시된 후 보안을 인식할 필요가 없습니다. 암호에 기호가 있는 경우 탈출에 주의하십시오. "데이터 소스=서버네임\SQLEXPRESS;데이터베이스=테스트 데이터베이스;사용자 id=사용자 이름;암호=**********"
f 이미 프로그램이 있더라도 덮어쓰기를 강제로 합니다. & No >
출력디르 코드가 출력되는 폴더 경로입니다. 프로젝트 폴더에서 상대 경로 모델\데이터베이스
문맥 엔터티 프레임워크를 사용할 때 컨텍스트 클래스 이름 테스트데이터베이스Db컨텍스트
데이터베이스 이름 사용 지정하면 데이터베이스의 테이블 이름이 클래스 이름이 있는 대로 됩니다. 그렇지 않으면 엔터티 클래스 이름의 케이스 및 여러 형식은 규칙에 따라 조정됩니다. & No >
데이터 주석 지정한 경우 열 유형은 각 속성에 DataNotnotation 특성을 자동으로 추가합니다. 데이터베이스 유형에 따라 입력을 자동으로 확인하려는 경우에 유용합니다. & No >

Enter를 누르면 다음과 같이 자동으로 코드가 생성됩니다.

사용자 테이블의 모델 코드는 다음과 같습니다.

[Table("User")]
public partial class User
{
  [Key]
  public int ID { get; set; }
  [Required]
  [StringLength(20)]
  public string Name { get; set; }
  [Required]
  [StringLength(20)]
  public string Password { get; set; }
  public int? Age { get; set; }
  [StringLength(200)]
  public string Email { get; set; }
  [Column(TypeName = "date")]
  public DateTime? Birthday { get; set; }
  public DateTime? UpdateDateTime { get; set; }
}

그런데 연결 문자열이 생성된 컨텍스트 클래스의 코드에 있는 것처럼 나열되므로 경고가 표시됩니다. 코드가 생성된 OnConfiguring 후 이 컨텍스트 클래스의 메서드를 삭제해야 합니다.

연결 문자열 등록

이 ASP.NET 코어 별 처리. (사용자 지정하는 경우 다른 .NET Core 앱에서 사용할 수 있지만 코어에 대해 기본적으로 처리할 수 ASP.NET 있습니다.

패키지 관리자 콘솔에 지정된 연결 문자열은 모델을 생성하는 데만 사용되었습니다.

웹 앱으로 데이터베이스에 연결하기 위한 연결 문자열이 appsettings.json에 나열됩니다. 각 빌드 또는 게시에 연결하도록 데이터베이스 대상을 변경하려면 앱 설정을 사용할 수 있습니다. 또한 Development.json 등에 의해 분기 될 수있다.

또한, 여기에 연결 문자열이 작업으로 사용되기 때문에, 연결 사용자를 보안 등을 고려하여 전담 사용자로 만드는 등의 조치를 취합시다.

appsettings.json으로 설정하면 루트 섹션(정확히 섹션이 아닌 개체)에 연결 문자열 섹션을 만듭니다. 키 와 값 세트를 만듭니다. 키의 이름은 무엇이든 할 수 있지만 나중에 사용할 수 있습니다. 값은 연결 문자열을 지정합니다.

{
  // 

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

엔터티 프레임워크 코어를 프로그램에서 사용할 수 있도록

이 ASP.NET 코어 별 처리. (사용자 지정하는 경우 다른 .NET Core 앱에서 사용할 수 있지만 코어에 대해 기본적으로 처리할 수 ASP.NET 있습니다.

코어 ASP.NET 각 인스턴스는 콘솔 및 데스크톱 앱과 다른 생존 시간이 있습니다. 예를 들어 "웹 서비스가 시작될 때까지 중지될 때까지" 또는 "응답이 반환될 때까지 요청이 수신되는 시점부터". 코어에 배치할 수 있는 ASP.NET 프레임워크 코어는 ServiceLifetime.Scoped 기본적으로 지정합니다. 특별한 이유가 없다면, 당신은 이런 식으로 머물 수 있습니다.

프로그램이 데이터베이스 컨텍스트에 액세스할 수 있도록 하려면 Startup.ConfigureServices 다음에 추가합니다.

// 追加 (自前のクラスなので名前空間は適時合わせてください)
using DatabaseEntityFrameworkCoreMvc.Models.Database;

// 追加
using Microsoft.EntityFrameworkCore;

public class Startup
{
  // 省略

  // このメソッドはランタイムによって呼び出されます。 このメソッドを使用して、コンテナーにサービスを追加します。
  public void ConfigureServices(IServiceCollection services)
  {
    // 省略

    // 追加
    services.AddDbContext<TestDatabaseDbContext>(
      options => options.UseSqlServer(Configuration.GetConnectionString("TestDatabaseDbContext")));
  }

  // 省略

services.AddDbContext<TestDatabaseDbContext> 메서드의 형식 인수는 만든 컨텍스트 클래스를 지정합니다.

options.UseSqlServer 메서드는 SQL 서버가 사용되어 있음을 나타냅니다.

Configuration.GetConnectionString("TestDatabaseDbContext") appsettings.json에 등록된 키 이름을 지정합니다.

코어 MVC의 ASP.NET 사용 사례

ASP.NET 코어 MVC에서 엔터티 프레임워크 코어를 사용하는 여러 가지 방법입니다.

컨트롤러에 디(종속성 인서트) 추가

스타트업에서 .cs 메서드를 등록하.cs services.AddDbContext TestDatabaseDbContext 컨트롤러에 삽입할 수 있습니다.

DI의 HomeController 예는 생성자가 인수를 가지고 있다는 ILogger<HomeController> logger 것입니다. 이것은 DI에 의해 추가됩니다. 같은 방법으로 삽입할 수 TestDatabaseDbContext 있습니다.

HomeController기존에 추가하려면 다음과 같습니다. 물론 다른 컨트롤러에 추가할 수 있습니다.

using DatabaseEntityFrameworkCoreMvc.Models.Database;  // 追加

// 省略

public class HomeController : Controller
{
  private readonly ILogger<HomeController> _logger;
  
  // 追加
  private readonly TestDatabaseDbContext _dbContext;
  
  public HomeController(ILogger<HomeController> logger, TestDatabaseDbContext dbContext)  // 追加
  {
    _logger = logger;
    _dbContext = dbContext;  // 追加
  }
  
  // 省略
}

그런 다음 각 작업에서 받은 컨텍스트의 인스턴스를 사용하여 데이터베이스에 액세스할 수 있습니다.

서비스 케이스 사용

다음 코드는 사용자 목록 및 새 등록을 처리하는 코드입니다. 지금부터 ASP.NET 코어에서 엔티티 프레임워크 코어는 각각의 코드가 되므로 자세히 설명하지 않습니다.

엔터티 프레임워크 코어 생성 모델은 여전히 작업의 모델로 사용할 수 있습니다. 별도의 모델을 만들고 엔터티 프레임워크 코어 모델을 랩핑하고 사용할 수도 있습니다.

또한 사용자의 요청이 끝나면 컨텍스트가 자동으로 삭제됩니다.

홈 컨트롤러.cs

public class HomeController : Controller
{
  private readonly TestDatabaseDbContext _dbContext;

  // 省略

  // ここから追加

  /// <summary>
  /// ユーザー一覧表示アクション。
  /// </summary>
  public IActionResult List()
  {
    // データベースから User 一覧を取得する
    var users = _dbContext.Users.ToList();
    
    // ビューに渡す
    return View(users);
  }
  
  /// <summary>
  /// ユーザー一新規登録画面。
  /// </summary>
  public IActionResult Create()
  {
    return View();
  }
  
  /// <summary>
  /// ユーザー新規登録処理。
  /// </summary>
  [HttpPost]
  public IActionResult Create(User user)
  {
    // エラーがある場合は登録画面に戻る
    if (ModelState.IsValid == false) View(user);
    
    // 更新日時設定
    user.UpdateDateTime = DateTime.Now;

    // 登録リストにユーザー追加
    _dbContext.Users.Add(user);

    // 登録を確定する
    _dbContext.SaveChanges();
    
    // 一覧画面に遷移
    return RedirectToAction(nameof(List));
  }

  // ここまで追加

  // 省略
}

수동으로 화면을 만드는 것은 번거롭기 때문에 목록 화면은 스캐폴딩으로 자동으로 생성됩니다.

Views/Home/List.cshtml자동 생성은 다음과 같습니다.

@model IEnumerable<DatabaseEntityFrameworkCoreMvc.Models.Database.User>

@{
  ViewData["Title"] = "List";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>List</h1>

<p>
  <a asp-action="Create">Create New</a>
</p>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.ID)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Name)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Password)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Age)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Email)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Birthday)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.UpdateDateTime)
      </th>
      <th></th>
    </tr>
  </thead>
  <tbody>
@foreach (var item in Model) {
    <tr>
      <td>
        @Html.DisplayFor(modelItem => item.ID)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Name)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Password)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Age)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Email)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Birthday)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.UpdateDateTime)
      </td>
      <td>
        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
      </td>
    </tr>
}
  </tbody>
</table>

Index.cshtml 목록에 화면 전환에 대한 링크를 추가합니다.

<!-- 省略 -->

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

사용자 등록 화면도 자동으로 생성됩니다.

Views/Home/Create.cshtml자동 생성은 다음과 같습니다. 사용이 어렵기 때문에 조금 고쳐 주었어요.

@model DatabaseEntityFrameworkCoreMvc.Models.Database.User

@{
  ViewData["Title"] = "Create";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="ID" class="control-label"></label>
        <input asp-for="ID" class="form-control" />
        <span asp-validation-for="ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Password" class="control-label"></label>
        <input asp-for="Password" class="form-control" type="password" /> <!-- type="password" 追加 -->
        <span asp-validation-for="Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Age" class="control-label"></label>
        <input asp-for="Age" class="form-control" />
        <span asp-validation-for="Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Email" class="control-label"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Birthday" class="control-label"></label>
        <input asp-for="Birthday" class="form-control" type="date" /> <!-- type="date" 追加 -->
        <span asp-validation-for="Birthday" class="text-danger"></span>
      </div>
      @* 更新日時は入力しないのでコメントアウト *@
      @*
      <div class="form-group">
        <label asp-for="UpdateDateTime" class="control-label"></label>
        <input asp-for="UpdateDateTime" class="form-control "/>
        <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
      </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
    <a asp-action="List">Back to List</a>  <!-- List に遷移するように変更 -->
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

실행하고 확인합니다. 그런데 암호 등록과 같은 보안 조치가 없으므로 운영 시 코어 및 데이터베이스 등록 방법을 ASP.NET 따르십시오.

물론 데이터베이스에 반영됩니다.

이 팁은 편집 또는 삭제를 만들지 않으므로 오른쪽 편집을 사용할 수 | 세부 정보 | 삭제"는 또한 오류가 발생합니다. 만들기와 같은 방식으로 만들 수 있으므로 시도해 보십시오. 위의 세 가지 프로세스도 샘플 코드에 추가되었습니다.

요청 서비스에서 데이터베이스 컨텍스트 받기

컨트롤러 생성체에 di를 추가하는 것은 필요한 모든 컨트롤러에 추가해야 하기 때문에 약간 번거로울 수 있습니다. 또는. RequestServices

샘플 코드에는 포함되지 않지만 다음과 같이 얻을 수 있습니다.

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

데이터베이스 컨텍스트 직접 만들기

콘솔 및 데스크톱 앱에도 사용됩니다. 문제 없이 이 방법을 사용할 수 있습니다. 동시 액세스가 발생할 가능성이 있는 웹 응용 프로그램에서 트랜잭션 범위가 모호한 경향이 있으므로 권장되지 않습니다. 특히 업데이트는 요청별로 롤백되지 않을 수 있습니다.

이러한 방식으로 데이터베이스에 액세스하면 DbContext 기술을 사용하여 .를 파생합니다.

먼저 Startup 작업할 을 Configuration static 수정합니다.

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

  // 省略
}

TestDatabaseDbContext 에서 파생된 클래스를 만들고 TestDatabaseDbContextEx appsettings.json 연결 문자열을 설정합니다. 연결 문자열을 설정할 수 있는 경우 생성자 전달과 같은 다른 메서드를 사용할 수 있습니다.

using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

namespace DatabaseEntityFrameworkCoreMvc.Models.Database
{
  public partial class TestDatabaseDbContextEx : TestDatabaseDbContext
  {
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      if (!optionsBuilder.IsConfigured)
      {
        optionsBuilder.UseSqlServer(Startup.ConfigurationStatic.GetConnectionString("TestDatabaseDbContext"));
      }
    }
  }
}

데이터베이스에 액세스하려면 파생 된 클래스의 인스턴스를 생성하고 사용합니다.

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

코어 면도기 페이지의 ASP.NET 예제

코어 면도기 페이지에서 엔터티 프레임워크 코어를 사용하는 여러 가지 방법을 ASP.NET 있습니다.

페이지 모델에 di(종속성 인서트) 추가

스타트업에서 .cs 메서드를 등록하.cs services.AddDbContext TestDatabaseDbContext 페이지 모델에 삽입할 수 있습니다.

DI의 IndexModel 예는 생성자가 인수를 가지고 있다는 ILogger<IndexModel> logger 것입니다. 이것은 DI에 의해 추가됩니다. 같은 방법으로 삽입할 수 TestDatabaseDbContext 있습니다.

IndexModel기존에 추가하려면 다음과 같습니다. 물론 다른 페이지 모델에 추가할 수 있습니다.

using DatabaseEntityFrameworkCoreMvc.Models.Database;  // 追加

// 省略

public class IndexModel : PageModel
{
  private readonly ILogger<IndexModel> _logger;
  
  // 追加
  private readonly TestDatabaseDbContext _dbContext;
  
  public IndexModel(ILogger<IndexModel> logger, TestDatabaseDbContext dbContext)  // 追加
  {
    _logger = logger;
    _dbContext = dbContext;  // 追加
  }
  
  // 省略
}

그런 다음 각 프로세스에서 받은 컨텍스트의 인스턴스를 사용하여 데이터베이스에 액세스할 수 있습니다.

서비스 케이스 사용

다음 코드는 사용자 목록 및 새 등록을 처리하는 코드입니다. 코어와 엔터티 프레임워크 코어 ASP.NET 모두 코드가 되므로 세부 정보로 이동하지 않습니다. 또한 사용자의 요청이 끝나면 컨텍스트가 자동으로 삭제됩니다.

목록 화면에 대한 페이지 모델을 만듭니다.

목록.cshtml.cs 다음과 같이:

using System.Collections.Generic;
using System.Linq;
using DatabaseEntityFrameworkCoreRazor.Models.Database;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace DatabaseEntityFrameworkCoreRazor.Pages
{
  public class ListModel : PageModel
  {
    private readonly TestDatabaseDbContext _dbContext;
    
    /// <summary>
    /// 一覧に表示するためのユーザー一覧を格納します。
    /// </summary>
    public List<User> Users { get; set; }
    
    /// <summary>
    /// DI で TestDatabaseDbContext を受け取ります。
    /// </summary>
    /// <param name="dbContext"></param>
    public ListModel(TestDatabaseDbContext dbContext)
    {
      _dbContext = dbContext;
    }
    
    /// <summary>
    /// ページにアクセスされたときに呼ばれます。
    /// </summary>
    public void OnGet()
    {
      // データベースからユーザー一覧を取得します。
      Users = _dbContext.Users.ToList();
    }
  }
}

목록.cshtml은 다음과 같이 만들어집니다.

@page
@model DatabaseEntityFrameworkCoreRazor.Pages.ListModel
@{
}

<h1>List</h1>

<p>
  <a asp-page="Create">Create New</a>
</p>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].ID)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Name)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Password)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Age)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Email)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Birthday)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].UpdateDateTime)
      </th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    @foreach (var item in Model.Users)
    {
      <tr>
        <td>
          @Html.DisplayFor(modelItem => item.ID)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Password)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Age)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Birthday)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.UpdateDateTime)
        </td>
        <td>
          <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
          <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
          <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
        </td>
      </tr>
    }
  </tbody>
</table>

목록 페이지로 전환할 수 있도록 Index.cshtml에 추가합니다.

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

사용자 등록 화면도 만듭니다.

다음과 같이.cshtml.cs 코드 만들기:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DatabaseEntityFrameworkCoreRazor.Models.Database;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace DatabaseEntityFrameworkCoreRazor.Pages
{
  public class CreateModel : PageModel
  {
    private readonly TestDatabaseDbContext _dbContext;

    /// <summary>
    /// 登録するユーザー情報を格納します。
    /// </summary>
    [BindProperty]
    public User UserInfo { get; set; }

    /// <summary>
    /// DI で TestDatabaseDbContext を受け取ります。
    /// </summary>
    /// <param name="dbContext"></param>
    public CreateModel(TestDatabaseDbContext dbContext)
    {
      _dbContext = dbContext;
    }

    /// <summary>
    /// ページにアクセスされたときに呼ばれます。
    /// </summary>
    public void OnGet()
    {
      // 画面表示時は何もしません。
    }

    /// <summary>
    /// POST が送信されたときに呼ばれる。
    /// </summary>
    public IActionResult OnPost()
    {
      // エラーがある場合は登録画面に戻る
      if (ModelState.IsValid == false) return Page();

      // 更新日時設定
      UserInfo.UpdateDateTime = DateTime.Now;

      // 登録リストにユーザー追加
      _dbContext.Users.Add(UserInfo);

      // 登録を確定する
      _dbContext.SaveChanges();

      // 一覧画面に遷移
      return RedirectToPage("List");
    }
  }
}

다음과 같이.cshtml을 만듭니다.

@page
@model DatabaseEntityFrameworkCoreRazor.Pages.CreateModel
@{
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="UserInfo.ID" class="control-label"></label>
        <input asp-for="UserInfo.ID" class="form-control" />
        <span asp-validation-for="UserInfo.ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Name" class="control-label"></label>
        <input asp-for="UserInfo.Name" class="form-control" />
        <span asp-validation-for="UserInfo.Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Password" class="control-label"></label>
        <input asp-for="UserInfo.Password" class="form-control" type="password" />
        <span asp-validation-for="UserInfo.Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Age" class="control-label"></label>
        <input asp-for="UserInfo.Age" class="form-control" />
        <span asp-validation-for="UserInfo.Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Email" class="control-label"></label>
        <input asp-for="UserInfo.Email" class="form-control" />
        <span asp-validation-for="UserInfo.Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Birthday" class="control-label"></label>
        <input asp-for="UserInfo.Birthday" class="form-control" type="date" />
        <span asp-validation-for="UserInfo.Birthday" class="text-danger"></span>
      </div>
      @*
        <div class="form-group">
          <label asp-for="UpdateDateTime" class="control-label"></label>
          <input asp-for="UpdateDateTime" class="form-control" />
          <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
        </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
  <a asp-page="List">Back to List</a>
</div>

실행하고 확인합니다. 그런데 암호 등록과 같은 보안 조치가 없으므로 운영 시 코어 및 데이터베이스 등록 방법을 ASP.NET 따르십시오.

물론 데이터베이스에 반영됩니다.

편집이나 삭제를 만들지 않았기 때문에 편집을 원하지 않아 | 세부 정보 | 삭제"는 또한 오류가 발생합니다. 만들기와 같은 방식으로 만들 수 있으므로 시도해 보십시오. 위의 세 가지 프로세스도 샘플 코드에 추가되었습니다.

요청 서비스에서 데이터베이스 컨텍스트 받기

당신이 필요로하는 모든 페이지 모델에 추가해야하기 때문에 페이지 모델 생성에 디를 추가하는 것은 조금 번거롭다. 또는. RequestServices

샘플 코드에는 포함되지 않지만 다음과 같이 얻을 수 있습니다.

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

데이터베이스 컨텍스트 직접 만들기

콘솔 및 데스크톱 앱에도 사용됩니다. 문제 없이 이 방법을 사용할 수 있습니다. 동시 액세스가 발생할 가능성이 있는 웹 응용 프로그램에서 트랜잭션 범위가 모호한 경향이 있으므로 권장되지 않습니다. 특히 업데이트는 요청별로 롤백되지 않을 수 있습니다.

이러한 방식으로 데이터베이스에 액세스하면 DbContext 기술을 사용하여 .를 파생합니다.

먼저 Startup 작업할 을 Configuration static 수정합니다.

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

  // 省略
}

TestDatabaseDbContext 에서 파생된 클래스를 만들고 TestDatabaseDbContextEx appsettings.json 연결 문자열을 설정합니다. 연결 문자열을 설정할 수 있는 경우 생성자 전달과 같은 다른 메서드를 사용할 수 있습니다.

using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

namespace DatabaseEntityFrameworkCoreRazor.Models.Database
{
  public partial class TestDatabaseDbContextEx : TestDatabaseDbContext
  {
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      if (!optionsBuilder.IsConfigured)
      {
        optionsBuilder.UseSqlServer(Startup.ConfigurationStatic.GetConnectionString("TestDatabaseDbContext"));
      }
    }
  }
}

데이터베이스에 액세스하려면 파생 된 클래스의 인스턴스를 생성하고 사용합니다.

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