다음을 통해 공유


2부. ASP.NET Core에서 Razor Pages 앱에 모델 추가

참고 항목

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

Warning

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

Important

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

이 자습서에서는 데이터베이스에서 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다. 먼저 모델 클래스를 작성하면 EF Core 가 데이터베이스를 만듭니다.

모델 클래스는 종속성이 EF Core없으므로 POCO 클래스("Plain-O ld CLR Objects")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.

데이터 모델 추가

  1. 솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.

  2. Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.

  3. Movie 클래스에 다음 속성을 추가합니다.

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Movie 클래스에는 다음이 포함됩니다.

  • ID 필드는 데이터베이스에서 기본 키 대신 필요합니다.

  • ReleaseDate 속성의 데이터 형식을 지정하는 [DataType] 특성입니다. 이 특성을 사용하면:

    • 사용자가 날짜 필드에 시간 정보를 입력할 필요가 없습니다.
    • 시간 정보 없이 날짜만 표시됩니다.
  • string 다음의 물음표는 속성이 null 허용임을 나타냅니다. 자세한 내용은 nullable 참조 형식을 참조하세요.

DataAnnotations는 이후 자습서에서 다룹니다.

프로젝트를 빌드하여 컴파일 오류가 없는지 확인합니다.

동영상 모델 스캐폴드

이 섹션에서는 영화 모델을 스캐폴드 합니다. 즉, 스캐폴드 도구는 동영상 모델에서 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 위한 페이지를 생성합니다.

  1. Pages/Movies 폴더를 만듭니다.

    1. Pages 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 폴더를 선택합니다.
    2. 폴더 이름을 Movies로 지정합니다.
  2. Pages/Movies 폴더를 마우스 오른쪽 단추로 클릭하고 추가>스캐폴드 항목 새로 만들기를 선택합니다.

    새 스캐폴드 항목

  3. 새 스캐폴드 추가 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>추가를 선택합니다.

    스캐폴드 추가

  4. Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.

    1. 모델 클래스 드롭다운에서 동영상(RazorPagesMovie.Models)을 선택합니다.
    2. 데이터 컨텍스트 클래스 행에서 +(더하기) 기호를 선택합니다.
      1. 데이터 컨텍스트 추가 대화 상자에서 클래스 이름 RazorPagesMovie.Data.RazorPagesMovieContext가 생성됩니다.
      2. 데이터베이스 공급자 드롭다운에서 SQL Server를 선택합니다.
    3. 추가를 선택합니다.

    페이지 추가 Razor

appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.

Warning

이 문서에서는 사용자를 인증할 필요가 없는 로컬 데이터베이스를 사용합니다. 프로덕션 앱은 사용 가능한 가장 안전한 인증 흐름을 사용해야 합니다. 배포된 테스트 및 프로덕션 앱의 인증에 대한 자세한 내용은 보안 인증 흐름을 참조 하세요.

파일이 생성 및 업데이트됨

스캐폴드 프로세스는 다음 파일을 만듭니다.

  • 페이지/동영상: 만들기, 삭제, 세부 정보, 편집 및 인덱스입니다.
  • Data/RazorPagesMovieContext.cs

생성된 파일은 다음 자습서에서 설명합니다.

스캐폴드 프로세스는 다음 강조 표시된 코드를 Program.cs 파일에 추가합니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

변경 내용은 Program.cs 이 자습서의 뒷부분에 설명되어 있습니다.

EF의 마이그레이션 기능을 사용하여 초기 데이터베이스 스키마 만들기

Entity Framework Core의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.

  • 초기 데이터베이스 스키마를 만듭니다.
  • 데이터베이스 스키마를 증분 업데이트하여 앱의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.

이 섹션에서는 패키지 관리자 콘솔(PMC) 창을 사용하여 다음을 수행합니다.

  • 초기 마이그레이션을 추가합니다.

  • 초기 마이그레이션을 사용하여 데이터베이스를 업데이트합니다.

  • 도구 메뉴에서 NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

    PMC 메뉴

  • PMC에서 다음 명령을 입력합니다.

    Add-Migration InitialCreate
    
  • Add-Migration 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.

다음 경고가 표시됩니다. 이 경고는 이후 단계에서 해결됩니다.

No type was specified for the decimal column ‘Price’ on entity type ‘Movie’. 그러면 값이 기본 전체 자릿수 및 소수 자릿수에 적합하지 않은 경우 자동으로 잘립니다. Explicitly specify the SQL server column type that can accommodate all the values using ‘HasColumnType()’.

  • PMC에서 다음 명령을 입력합니다.

    Update-Database
    

    Update-Database 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 명령은 파일에서 메서드를 Up Migrations/<time-stamp>_InitialCreate.cs 실행하여 데이터베이스를 만듭니다.

데이터 컨텍스트 RazorPagesMovieContext는 다음과 같은 특성이 있습니다.

  • Microsoft.EntityFrameworkCore.DbContext에서 파생됩니다.
  • 데이터 모델에 포함되는 엔터티를 지정합니다.
  • Movie 모델에 대한 EF Core 기능(예: 만들기, 읽기, 업데이트, 삭제)을 조정합니다.

RazorPagesMovieContext 생성된 파일Data/RazorPagesMovieContext.cs의 클래스:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

이전 코드에서는 엔터티 집합에 대한 DbSet<Movie> 속성을 만듭니다. Entity Framework 용어에서 엔터티 집합은 일반적으로 데이터베이스 테이블에 해당합니다. 엔터티는 테이블의 행에 해당합니다.

DbContextOptions 개체에서 메서드를 호출하여 연결 문자열의 이름을 컨텍스트에 전달합니다. 로컬 개발의 경우 구성 시스템appsettings.json 파일에서 연결 문자열을 읽습니다.

앱 테스트

  1. 앱을 실행하고 브라우저에서 URL에 /Movies를 추가합니다(http://localhost:port/movies).

    다음과 같은 오류 메시지가 나타나는 경우:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    마이그레이션 단계를 누락했습니다.

  2. 새로 만들기 링크를 테스트합니다.

    만들기 페이지

    참고 항목

    Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.

  3. Edit, DetailsDelete 링크를 테스트합니다.

다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.

종속성 주입을 사용하여 등록된 컨텍스트 확인

ASP.NET Core는 종속성 주입을 사용하여 빌드됩니다. 서비스(예: EF Core 데이터베이스 컨텍스트)는 애플리케이션 시작 중에 종속성 주입에 등록됩니다. 이러한 서비스(예: Razor Pages)가 필요한 구성 요소는 생성자 매개 변수를 통해 제공됩니다. 데이터베이스 컨텍스트 인스턴스를 가져오는 생성자 코드는 자습서 뒷부분에 나옵니다.

스캐폴딩 도구는 자동으로 데이터베이스 컨텍스트를 생성하고 종속성 주입 컨테이너에 등록했습니다. 다음 강조 표시된 코드는 스캐폴더에 의해 파일에 추가 Program.cs 됩니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

완료된 샘플 문제 해결

해결할 수 없는 문제가 발생한 경우 완료된 프로젝트와 코드를 비교합니다. 완료된 프로젝트를 보거나 다운로드합니다(다운로드 방법).

다음 단계

이 자습서에서는 데이터베이스에서 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다. 먼저 모델 클래스를 작성하면 EF Core 가 데이터베이스를 만듭니다.

모델 클래스는 종속성이 EF Core없으므로 POCO 클래스("Plain-O ld CLR Objects")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.

데이터 모델 추가

  1. 솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.

  2. Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.

  3. Movie 클래스에 다음 속성을 추가합니다.

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Movie 클래스에는 다음이 포함됩니다.

  • ID 필드는 데이터베이스에서 기본 키 대신 필요합니다.

  • ReleaseDate 속성의 데이터 형식을 지정하는 [DataType] 특성입니다. 이 특성을 사용하면:

    • 사용자가 날짜 필드에 시간 정보를 입력할 필요가 없습니다.
    • 시간 정보 없이 날짜만 표시됩니다.
  • string 다음의 물음표는 속성이 null 허용임을 나타냅니다. 자세한 내용은 nullable 참조 형식을 참조하세요.

DataAnnotations는 이후 자습서에서 다룹니다.

프로젝트를 빌드하여 컴파일 오류가 없는지 확인합니다.

동영상 모델 스캐폴드

이 섹션에서는 영화 모델을 스캐폴드 합니다. 즉, 스캐폴드 도구는 동영상 모델에서 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 위한 페이지를 생성합니다.

  1. Pages/Movies 폴더를 만듭니다.

    1. Pages 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 폴더를 선택합니다.
    2. 폴더 이름을 Movies로 지정합니다.
  2. Pages/Movies 폴더를 마우스 오른쪽 단추로 클릭하고 추가>스캐폴드 항목 새로 만들기를 선택합니다.

    새 스캐폴드 항목

  3. 새 스캐폴드 추가 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>추가를 선택합니다.

    스캐폴드 추가

  4. Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.

    1. 모델 클래스 드롭다운에서 동영상(RazorPagesMovie.Models)을 선택합니다.
    2. 데이터 컨텍스트 클래스 행에서 +(더하기) 기호를 선택합니다.
      1. 데이터 컨텍스트 추가 대화 상자에서 클래스 이름 RazorPagesMovie.Data.RazorPagesMovieContext가 생성됩니다.
      2. 데이터베이스 공급자 드롭다운에서 SQL Server를 선택합니다.
    3. 추가를 선택합니다.

    페이지 추가 Razor

appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.

Warning

이 문서에서는 사용자를 인증할 필요가 없는 로컬 데이터베이스를 사용합니다. 프로덕션 앱은 사용 가능한 가장 안전한 인증 흐름을 사용해야 합니다. 배포된 테스트 및 프로덕션 앱의 인증에 대한 자세한 내용은 보안 인증 흐름을 참조 하세요.

파일이 생성 및 업데이트됨

스캐폴드 프로세스는 다음 파일을 만듭니다.

  • 페이지/동영상: 만들기, 삭제, 세부 정보, 편집 및 인덱스입니다.
  • Data/RazorPagesMovieContext.cs

생성된 파일은 다음 자습서에서 설명합니다.

스캐폴드 프로세스는 다음 강조 표시된 코드를 Program.cs 파일에 추가합니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

변경 내용은 Program.cs 이 자습서의 뒷부분에 설명되어 있습니다.

EF의 마이그레이션 기능을 사용하여 초기 데이터베이스 스키마 만들기

Entity Framework Core의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.

  • 초기 데이터베이스 스키마를 만듭니다.
  • 데이터베이스 스키마를 증분 업데이트하여 앱의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.

이 섹션에서는 패키지 관리자 콘솔(PMC) 창을 사용하여 다음을 수행합니다.

  • 초기 마이그레이션을 추가합니다.

  • 초기 마이그레이션을 사용하여 데이터베이스를 업데이트합니다.

  • 도구 메뉴에서 NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

    PMC 메뉴

  • PMC에서 다음 명령을 입력합니다.

    Add-Migration InitialCreate
    
  • Add-Migration 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.

다음 경고가 표시됩니다. 이 경고는 이후 단계에서 해결됩니다.

No type was specified for the decimal column ‘Price’ on entity type ‘Movie’. 그러면 값이 기본 전체 자릿수 및 소수 자릿수에 적합하지 않은 경우 자동으로 잘립니다. Explicitly specify the SQL server column type that can accommodate all the values using ‘HasColumnType()’.

  • PMC에서 다음 명령을 입력합니다.

    Update-Database
    

    Update-Database 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 명령은 파일에서 메서드를 Up Migrations/<time-stamp>_InitialCreate.cs 실행하여 데이터베이스를 만듭니다.

데이터 컨텍스트 RazorPagesMovieContext는 다음과 같은 특성이 있습니다.

  • Microsoft.EntityFrameworkCore.DbContext에서 파생됩니다.
  • 데이터 모델에 포함되는 엔터티를 지정합니다.
  • Movie 모델에 대한 EF Core 기능(예: 만들기, 읽기, 업데이트, 삭제)을 조정합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

이전 코드에서는 엔터티 집합에 대한 DbSet<Movie> 속성을 만듭니다. Entity Framework 용어에서 엔터티 집합은 일반적으로 데이터베이스 테이블에 해당합니다. 엔터티는 테이블의 행에 해당합니다.

DbContextOptions 개체에서 메서드를 호출하여 연결 문자열의 이름을 컨텍스트에 전달합니다. 로컬 개발의 경우 구성 시스템appsettings.json 파일에서 연결 문자열을 읽습니다.

앱 테스트

  1. 앱을 실행하고 브라우저에서 URL에 /Movies를 추가합니다(http://localhost:port/movies).

    다음과 같은 오류 메시지가 나타나는 경우:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    마이그레이션 단계를 누락했습니다.

  2. 새로 만들기 링크를 테스트합니다.

    만들기 페이지

    참고 항목

    Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.

  3. Edit, DetailsDelete 링크를 테스트합니다.

다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.

종속성 주입을 사용하여 등록된 컨텍스트 확인

ASP.NET Core는 종속성 주입을 사용하여 빌드됩니다. 서비스(예: EF Core 데이터베이스 컨텍스트)는 애플리케이션 시작 중에 종속성 주입에 등록됩니다. 이러한 서비스(예: Razor Pages)가 필요한 구성 요소는 생성자 매개 변수를 통해 제공됩니다. 데이터베이스 컨텍스트 인스턴스를 가져오는 생성자 코드는 자습서 뒷부분에 나옵니다.

스캐폴딩 도구는 자동으로 데이터베이스 컨텍스트를 생성하고 종속성 주입 컨테이너에 등록했습니다. 다음 강조 표시된 코드는 스캐폴더에 의해 파일에 추가 Program.cs 됩니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

완료된 샘플 문제 해결

해결할 수 없는 문제가 발생한 경우 완료된 프로젝트와 코드를 비교합니다. 완료된 프로젝트를 보거나 다운로드합니다(다운로드 방법).

다음 단계

이 자습서에서는 데이터베이스에서 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다. 먼저 모델 클래스를 작성하면 EF Core 가 데이터베이스를 만듭니다.

모델 클래스는 종속성이 EF Core없으므로 POCO 클래스("Plain-O ld CLR Objects")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.

데이터 모델 추가

  1. 솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.

  2. Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.

  3. Movie 클래스에 다음 속성을 추가합니다.

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Movie 클래스에는 다음이 포함됩니다.

  • ID 필드는 데이터베이스에서 기본 키 대신 필요합니다.

  • ReleaseDate 속성의 데이터 형식을 지정하는 [DataType] 특성입니다. 이 특성을 사용하면:

    • 사용자가 날짜 필드에 시간 정보를 입력할 필요가 없습니다.
    • 시간 정보 없이 날짜만 표시됩니다.
  • string 다음의 물음표는 속성이 null 허용임을 나타냅니다. 자세한 내용은 nullable 참조 형식을 참조하세요.

DataAnnotations는 이후 자습서에서 다룹니다.

프로젝트를 빌드하여 컴파일 오류가 없는지 확인합니다.

동영상 모델 스캐폴드

이 섹션에서는 영화 모델을 스캐폴드 합니다. 즉, 스캐폴드 도구는 동영상 모델에서 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 위한 페이지를 생성합니다.

  1. Pages/Movies 폴더를 만듭니다.

    1. Pages 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 폴더를 선택합니다.
    2. 폴더 이름을 Movies로 지정합니다.
  2. Pages/Movies 폴더를 마우스 오른쪽 단추로 클릭하고 추가>스캐폴드 항목 새로 만들기를 선택합니다.

    새 스캐폴드 항목

  3. 새 스캐폴드 추가 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>추가를 선택합니다.

    스캐폴드 추가

  4. Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.

    1. 모델 클래스 드롭다운에서 동영상(RazorPagesMovie.Models)을 선택합니다.
    2. 데이터 컨텍스트 클래스 행에서 +(더하기) 기호를 선택합니다.
      1. 데이터 컨텍스트 추가 대화 상자에서 클래스 이름 RazorPagesMovie.Data.RazorPagesMovieContext가 생성됩니다.
      2. 데이터베이스 공급자 드롭다운에서 SQL Server를 선택합니다.
    3. 추가를 선택합니다.

    페이지 추가 Razor

appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.

Warning

이 문서에서는 사용자를 인증할 필요가 없는 로컬 데이터베이스를 사용합니다. 프로덕션 앱은 사용 가능한 가장 안전한 인증 흐름을 사용해야 합니다. 배포된 테스트 및 프로덕션 앱의 인증에 대한 자세한 내용은 보안 인증 흐름을 참조 하세요.

파일이 생성 및 업데이트됨

스캐폴드 프로세스는 다음 파일을 만듭니다.

  • 페이지/동영상: 만들기, 삭제, 세부 정보, 편집 및 인덱스입니다.
  • Data/RazorPagesMovieContext.cs

생성된 파일은 다음 자습서에서 설명합니다.

스캐폴드 프로세스는 다음 강조 표시된 코드를 Program.cs 파일에 추가합니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

변경 내용은 Program.cs 이 자습서의 뒷부분에 설명되어 있습니다.

EF의 마이그레이션 기능을 사용하여 초기 데이터베이스 스키마 만들기

Entity Framework Core의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.

  • 초기 데이터베이스 스키마를 만듭니다.
  • 데이터베이스 스키마를 증분 업데이트하여 앱의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.

이 섹션에서는 패키지 관리자 콘솔(PMC) 창을 사용하여 다음을 수행합니다.

  • 초기 마이그레이션을 추가합니다.
  • 초기 마이그레이션을 사용하여 데이터베이스를 업데이트합니다.
  1. 도구 메뉴에서 NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

    PMC 메뉴

  2. PMC에서 다음 명령을 입력합니다.

    Add-Migration InitialCreate
    Update-Database
    
  • Add-Migration 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.

  • Update-Database 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 명령은 파일에서 메서드를 Up Migrations/<time-stamp>_InitialCreate.cs 실행하여 데이터베이스를 만듭니다.

다음 경고가 표시됩니다. 이 경고는 이후 단계에서 해결됩니다.

No type was specified for the decimal column ‘Price’ on entity type ‘Movie’. 그러면 값이 기본 전체 자릿수 및 소수 자릿수에 적합하지 않은 경우 자동으로 잘립니다. Explicitly specify the SQL server column type that can accommodate all the values using ‘HasColumnType()’.

데이터 컨텍스트 RazorPagesMovieContext는 다음과 같은 특성이 있습니다.

  • Microsoft.EntityFrameworkCore.DbContext에서 파생됩니다.
  • 데이터 모델에 포함되는 엔터티를 지정합니다.
  • Movie 모델에 대한 EF Core 기능(예: 만들기, 읽기, 업데이트, 삭제)을 조정합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

이전 코드에서는 엔터티 집합에 대한 DbSet<Movie> 속성을 만듭니다. Entity Framework 용어에서 엔터티 집합은 일반적으로 데이터베이스 테이블에 해당합니다. 엔터티는 테이블의 행에 해당합니다.

DbContextOptions 개체에서 메서드를 호출하여 연결 문자열의 이름을 컨텍스트에 전달합니다. 로컬 개발의 경우 구성 시스템appsettings.json 파일에서 연결 문자열을 읽습니다.

앱 테스트

  1. 앱을 실행하고 브라우저에서 URL에 /Movies를 추가합니다(http://localhost:port/movies).

    다음과 같은 오류 메시지가 나타나는 경우:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    마이그레이션 단계를 누락했습니다.

  2. 새로 만들기 링크를 테스트합니다.

    만들기 페이지

    참고 항목

    Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.

  3. Edit, DetailsDelete 링크를 테스트합니다.

다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.

종속성 주입을 사용하여 등록된 컨텍스트 확인

ASP.NET Core는 종속성 주입을 사용하여 빌드됩니다. 서비스(예: EF Core 데이터베이스 컨텍스트)는 애플리케이션 시작 중에 종속성 주입에 등록됩니다. 이러한 서비스(예: Razor Pages)가 필요한 구성 요소는 생성자 매개 변수를 통해 제공됩니다. 데이터베이스 컨텍스트 인스턴스를 가져오는 생성자 코드는 자습서 뒷부분에 나옵니다.

스캐폴딩 도구는 자동으로 데이터베이스 컨텍스트를 생성하고 종속성 주입 컨테이너에 등록했습니다. 다음 강조 표시된 코드는 스캐폴더에 의해 파일에 추가 Program.cs 됩니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

완료된 샘플 문제 해결

해결할 수 없는 문제가 발생한 경우 완료된 프로젝트와 코드를 비교합니다. 완료된 프로젝트를 보거나 다운로드합니다(다운로드 방법).

다음 단계

이 자습서에서는 데이터베이스에서 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다. 먼저 모델 클래스를 작성하면 EF Core 가 데이터베이스를 만듭니다.

모델 클래스는 종속성이 EF Core없으므로 POCO 클래스("Plain-O ld CLR Objects")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.

데이터 모델 추가

  1. 솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.

  2. Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.

  3. Movie 클래스에 다음 속성을 추가합니다.

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; } = string.Empty;
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; } = string.Empty;
            public decimal Price { get; set; }
        }
    }
    

Movie 클래스에는 다음이 포함됩니다.

  • ID 필드는 데이터베이스에서 기본 키 대신 필요합니다.

  • ReleaseDate 속성의 데이터 형식을 지정하는 [DataType] 특성입니다. 이 특성을 사용하면:

    • 사용자가 날짜 필드에 시간 정보를 입력할 필요가 없습니다.
    • 시간 정보 없이 날짜만 표시됩니다.

DataAnnotations는 이후 자습서에서 다룹니다.

프로젝트를 빌드하여 컴파일 오류가 없는지 확인합니다.

동영상 모델 스캐폴드

이 섹션에서는 영화 모델을 스캐폴드 합니다. 즉, 스캐폴드 도구는 동영상 모델에서 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 위한 페이지를 생성합니다.

  1. 스캐폴딩 도구에 필요한 NuGet 패키지 Microsoft.EntityFrameworkCore.Design을 추가합니다.

    1. 도구 메뉴에서 NuGet 패키지 관리자> 솔루션용 NuGet 패키지 관리를 선택합니다.NuGet 패키지 관리자 - 관리
    2. 찾아보기 탭을 선택합니다.
    3. Microsoft.EntityFrameworkCore.Design을 입력하고 목록에서 선택합니다.
    4. 프로젝트를 선택한 다음, 설치를 선택합니다.
    5. 라이선스 승인 대화 상자에서 동의함을 선택합니다. NuGet 패키지 관리자 - 패키지 추가
  2. Pages/Movies 폴더를 만듭니다.

    1. Pages 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 폴더를 선택합니다.
    2. 폴더 이름을 Movies로 지정합니다.
  3. Pages/Movies 폴더를 마우스 오른쪽 단추로 클릭하고 추가>스캐폴드 항목 새로 만들기를 선택합니다.

    새 스캐폴드 항목

  4. 새 스캐폴드 추가 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>추가를 선택합니다.

    스캐폴드 추가

  5. Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.

    1. 모델 클래스 드롭다운에서 동영상(RazorPagesMovie.Models)을 선택합니다.
    2. 데이터 컨텍스트 클래스 행에서 +(더하기) 기호를 선택합니다.
      1. 데이터 컨텍스트 추가 대화 상자에서 클래스 이름 RazorPagesMovie.Data.RazorPagesMovieContext가 생성됩니다.
    3. 추가를 선택합니다.

    페이지 추가 Razor

    Microsoft.EntityFrameworkCore.SqlServer 패키지를 설치해야 한다는 오류 메시지가 표시되면 추가>스캐폴드 항목 새로 만들기부터 단계를 반복합니다.

appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.

Warning

이 문서에서는 사용자를 인증할 필요가 없는 로컬 데이터베이스를 사용합니다. 프로덕션 앱은 사용 가능한 가장 안전한 인증 흐름을 사용해야 합니다. 배포된 테스트 및 프로덕션 앱의 인증에 대한 자세한 내용은 보안 인증 흐름을 참조 하세요.

파일이 생성 및 업데이트됨

스캐폴드 프로세스는 다음 파일을 만듭니다.

  • 페이지/동영상: 만들기, 삭제, 세부 정보, 편집 및 인덱스입니다.
  • Data/RazorPagesMovieContext.cs

생성된 파일은 다음 자습서에서 설명합니다.

스캐폴드 프로세스는 다음 강조 표시된 코드를 Program.cs 파일에 추가합니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

변경 내용은 Program.cs 이 자습서의 뒷부분에 설명되어 있습니다.

EF의 마이그레이션 기능을 사용하여 초기 데이터베이스 스키마 만들기

Entity Framework Core의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.

  • 초기 데이터베이스 스키마를 만듭니다.
  • 데이터베이스 스키마를 증분 업데이트하여 앱의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.

이 섹션에서는 패키지 관리자 콘솔(PMC) 창을 사용하여 다음을 수행합니다.

  • 초기 마이그레이션을 추가합니다.
  • 초기 마이그레이션을 사용하여 데이터베이스를 업데이트합니다.
  1. 도구 메뉴에서 NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

    PMC 메뉴

  2. PMC에서 다음 명령을 입력합니다.

    Add-Migration InitialCreate
    Update-Database
    
    

위의 명령은 Entity Framework Core 도구를 설치하고 migrations 명령을 실행하여 초기 데이터베이스 스키마를 만드는 코드를 생성합니다.

다음 경고가 표시됩니다. 이 경고는 이후 단계에서 해결됩니다.

No type was specified for the decimal column ‘Price’ on entity type ‘Movie’. 그러면 값이 기본 전체 자릿수 및 소수 자릿수에 적합하지 않은 경우 자동으로 잘립니다. Explicitly specify the SQL server column type that can accommodate all the values using ‘HasColumnType()’.

migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.

update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 updateMigrations/<time-stamp>_InitialCreate.cs 파일에서 Up 메서드를 실행하여 데이터베이스를 만듭니다.

종속성 주입을 사용하여 등록된 컨텍스트 확인

ASP.NET Core는 종속성 주입을 사용하여 빌드됩니다. 서비스(예: EF Core 데이터베이스 컨텍스트)는 애플리케이션 시작 중에 종속성 주입에 등록됩니다. 이러한 서비스(예: Razor Pages)가 필요한 구성 요소는 생성자 매개 변수를 통해 제공됩니다. 데이터베이스 컨텍스트 인스턴스를 가져오는 생성자 코드는 자습서 뒷부분에 나옵니다.

스캐폴딩 도구는 자동으로 데이터베이스 컨텍스트를 생성하고 종속성 주입 컨테이너에 등록했습니다. 다음 강조 표시된 코드는 스캐폴더에 의해 파일에 추가 Program.cs 됩니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

데이터 컨텍스트 RazorPagesMovieContext는 다음과 같은 특성이 있습니다.

  • Microsoft.EntityFrameworkCore.DbContext에서 파생됩니다.
  • 데이터 모델에 포함되는 엔터티를 지정합니다.
  • Movie 모델에 대한 EF Core 기능(예: 만들기, 읽기, 업데이트, 삭제)을 조정합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
    }
}

이전 코드에서는 엔터티 집합에 대한 DbSet<Movie> 속성을 만듭니다. Entity Framework 용어에서 엔터티 집합은 일반적으로 데이터베이스 테이블에 해당합니다. 엔터티는 테이블의 행에 해당합니다.

DbContextOptions 개체에서 메서드를 호출하여 연결 문자열의 이름을 컨텍스트에 전달합니다. 로컬 개발의 경우 구성 시스템appsettings.json 파일에서 연결 문자열을 읽습니다.

앱 테스트

  1. 앱을 실행하고 브라우저에서 URL에 /Movies를 추가합니다(http://localhost:port/movies).

    다음과 같은 오류 메시지가 나타나는 경우:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    마이그레이션 단계를 누락했습니다.

  2. 새로 만들기 링크를 테스트합니다.

    만들기 페이지

    참고 항목

    Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.

  3. Edit, DetailsDelete 링크를 테스트합니다.

다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.

완료된 샘플 문제 해결

해결할 수 없는 문제가 발생한 경우 완료된 프로젝트와 코드를 비교합니다. 완료된 프로젝트를 보거나 다운로드합니다(다운로드 방법).

다음 단계

이 섹션에서는 데이터베이스에서 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다. 먼저 모델 클래스를 작성하면 EF Core 가 데이터베이스를 만듭니다.

모델 클래스는 종속성이 EF Core없으므로 POCO 클래스("Plain-O ld CLR Objects")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.

예제 코드 살펴보기 및 다운로드 (다운로드 방법). 다운로드 예제는 영역을 테스트하기 위한 기초적인 앱을 제공합니다.

데이터 모델 추가

  1. 솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.

  2. Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.

  3. Movie 클래스에 다음 속성을 추가합니다.

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
        }
    }
    

Movie 클래스에는 다음이 포함됩니다.

  • ID 필드는 데이터베이스에서 기본 키 대신 필요합니다.

  • [DataType(DataType.Date)]: [DataType] 특성은 데이터 형식(Date)을 지정합니다. 이 특성을 사용하면:

    • 사용자가 날짜 필드에 시간 정보를 입력할 필요가 없습니다.
    • 시간 정보 없이 날짜만 표시됩니다.

DataAnnotations는 이후 자습서에서 다룹니다.

프로젝트를 빌드하여 컴파일 오류가 없는지 확인합니다.

동영상 모델 스캐폴드

이 섹션에서는 영화 모델을 스캐폴드 합니다. 즉, 스캐폴드 도구는 동영상 모델에서 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 위한 페이지를 생성합니다.

  1. Pages/Movies 폴더를 만듭니다.

    1. Pages 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 폴더를 선택합니다.
    2. 폴더 이름을 Movies로 지정합니다.
  2. Pages/Movies 폴더를 마우스 오른쪽 단추로 클릭하고 추가>스캐폴드 항목 새로 만들기를 선택합니다.

    새 스캐폴드 항목

  3. 스캐폴드 추가 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>추가를 선택합니다.

    스캐폴드 추가

  4. Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.

    1. 모델 클래스 드롭다운에서 동영상(RazorPagesMovie.Models)을 선택합니다.
    2. 데이터 컨텍스트 클래스 행에서 +(더하기) 기호를 선택합니다.
      1. 데이터 컨텍스트 추가 대화 상자에서 클래스 이름 RazorPagesMovie.Data.RazorPagesMovieContext가 생성됩니다.
    3. 추가를 선택합니다.

    페이지 추가 Razor

appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.

Warning

이 문서에서는 사용자를 인증할 필요가 없는 로컬 데이터베이스를 사용합니다. 프로덕션 앱은 사용 가능한 가장 안전한 인증 흐름을 사용해야 합니다. 배포된 테스트 및 프로덕션 앱의 인증에 대한 자세한 내용은 보안 인증 흐름을 참조 하세요.

파일이 생성 및 업데이트됨

스캐폴드 프로세스는 다음 파일을 만듭니다.

  • 페이지/동영상: 만들기, 삭제, 세부 정보, 편집 및 인덱스입니다.
  • Data/RazorPagesMovieContext.cs

업데이트된 파일

  • Startup.cs

생성되고 업데이트된 파일은 다음 섹션에서 설명합니다.

EF의 마이그레이션 기능을 사용하여 초기 데이터베이스 스키마 만들기

Entity Framework Core의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.

  • 초기 데이터베이스 스키마를 만듭니다.
  • 데이터베이스 스키마를 증분 방식으로 업데이트하여 애플리케이션의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.

이 섹션에서는 패키지 관리자 콘솔(PMC) 창을 사용하여 다음을 수행합니다.

  • 초기 마이그레이션을 추가합니다.
  • 초기 마이그레이션을 사용하여 데이터베이스를 업데이트합니다.
  1. 도구 메뉴에서 NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

    PMC 메뉴

  2. PMC에서 다음 명령을 입력합니다.

    Add-Migration InitialCreate
    Update-Database
    

SQL Server의 경우 이전 명령은 다음 경고를 생성합니다. "엔터티 형식 'Movie'에서 10진수 열 'Price'의 형식이 지정되지 않았습니다. 그러면 값이 기본 전체 자릿수 및 소수 자릿수에 적합하지 않은 경우 자동으로 잘립니다. 'HasColumnType()'를 사용하여 모든 값을 수용할 수 있는 SQL Server 열 형식을 명시적으로 지정합니다."

경고는 이후 단계에서 처리되므로 무시합니다.

migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.

update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 updateMigrations/<time-stamp>_InitialCreate.cs 파일에서 Up 메서드를 실행하여 데이터베이스를 만듭니다.

종속성 주입을 사용하여 등록된 컨텍스트 확인

ASP.NET Core는 종속성 주입을 사용하여 빌드됩니다. 서비스(예: EF Core 데이터베이스 컨텍스트)는 애플리케이션 시작 중에 종속성 주입에 등록됩니다. 이러한 서비스(예: Razor Pages)가 필요한 구성 요소는 생성자 매개 변수를 통해 제공됩니다. 데이터베이스 컨텍스트 인스턴스를 가져오는 생성자 코드는 자습서 뒷부분에 나옵니다.

스캐폴딩 도구는 자동으로 데이터베이스 컨텍스트를 생성하고 종속성 주입 컨테이너에 등록했습니다.

Startup.ConfigureServices 메서드를 검사합니다. 강조 표시된 줄은 스캐폴더에서 추가되었습니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

RazorPagesMovieContextMovie 모델에 대한 EF Core 기능(만들기, 읽기, 업데이트, 삭제)을 조정합니다. 데이터 컨텍스트(RazorPagesMovieContext)는 Microsoft.EntityFrameworkCore.DbContext에서 파생됩니다. 데이터 컨텍스트는 데이터 모델에 포함되는 엔터티를 지정합니다.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

이전 코드에서는 엔터티 집합에 대한 DbSet<Movie> 속성을 만듭니다. Entity Framework 용어에서 엔터티 집합은 일반적으로 데이터베이스 테이블에 해당합니다. 엔터티는 테이블의 행에 해당합니다.

DbContextOptions 개체에서 메서드를 호출하여 연결 문자열의 이름을 컨텍스트에 전달합니다. 로컬 개발의 경우 구성 시스템appsettings.json 파일에서 연결 문자열을 읽습니다.

앱 테스트

  1. 앱을 실행하고 브라우저에서 URL에 /Movies를 추가합니다(http://localhost:port/movies).

    다음과 같은 오류 메시지가 나타나는 경우:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    마이그레이션 단계를 누락했습니다.

  2. Create 링크를 테스트합니다.

    만들기 페이지

    참고 항목

    Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.

  3. Edit, DetailsDelete 링크를 테스트합니다.

Entity Framework Core의 SQL 로깅

로깅 구성은 일반적으로 appsettings.{Environment}.json 파일의 Logging 섹션에서 제공됩니다. SQL 문을 로깅하려면 "Microsoft.EntityFrameworkCore.Database.Command": "Information"appsettings.Development.json 파일에 추가합니다.

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}

위의 JSON을 사용하면 SQL 문이 명령줄과 Visual Studio 출력 창에 표시됩니다.

자세한 내용은 .NET Core 및 ASP.NET Core의 로깅 및 이 GitHub 이슈를 참조하세요.

다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.

다음 단계

이 섹션에서는 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다.

모델 클래스는 종속성이 EF Core없기 때문에 POCO 클래스("일반 오래된 CLR 개체")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.

예제 코드 살펴보기 및 다운로드 (다운로드 방법). 다운로드 예제는 영역을 테스트하기 위한 기초적인 앱을 제공합니다.

Warning

이 문서에서는 사용자를 인증할 필요가 없는 로컬 데이터베이스를 사용합니다. 프로덕션 앱은 사용 가능한 가장 안전한 인증 흐름을 사용해야 합니다. 배포된 테스트 및 프로덕션 앱의 인증에 대한 자세한 내용은 보안 인증 흐름을 참조 하세요.

데이터 모델 추가

RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.

Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.

Movie 클래스에 다음 속성을 추가합니다.

using System;
using System.ComponentModel.DataAnnotations;

namespace RazorPagesMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Movie 클래스에는 다음이 포함됩니다.

  • ID 필드는 데이터베이스에서 기본 키 대신 필요합니다.

  • [DataType(DataType.Date)]: DataType 특성은 데이터 형식(Date)을 지정합니다. 이 특성을 사용하면:

    • 사용자가 날짜 필드에 시간 정보를 입력할 필요가 없습니다.
    • 시간 정보 없이 날짜만 표시됩니다.

DataAnnotations는 이후 자습서에서 다룹니다.

DataAnnotations는 이후 자습서에서 다룹니다.

프로젝트를 빌드하여 컴파일 오류가 없는지 확인합니다.

동영상 모델 스캐폴드

이 섹션에서는 영화 모델을 스캐폴드 합니다. 즉, 스캐폴드 도구는 동영상 모델에서 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 위한 페이지를 생성합니다.

Pages/Movies 폴더를 만듭니다.

  • Pages 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 폴더를 선택합니다.
  • 폴더 이름을 Movies로 지정합니다.

Pages/Movies 폴더를 마우스 오른쪽 단추로 클릭하고 추가>스캐폴드 항목 새로 만들기를 선택합니다.

VScode의 새 스캐폴드 항목

스캐폴드 추가 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>추가를 선택합니다.

VScode에사 스캐폴드 추가

Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.

  • 모델 클래스 드롭다운에서 동영상(RazorPagesMovie.Models)을 선택합니다.
  • 데이터 컨텍스트 클래스 행에서 (더하기) 기호를 + 선택하고 RazorPagesMovieModels에서 생성된 이름을 변경합니다. RazorPagesMovieContext에서 RazorPagesMovie로.데이터입니다. RazorPagesMovieContext. 이 변경은 필수는 아닙니다. 올바른 네임스페이스를 사용하여 데이터베이스 컨텍스트 클래스를 만듭니다.
  • 추가를 선택합니다.

VScode에 페이지 추가 Razor

appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.

생성된 파일

스캐폴드 프로세스는 다음 파일을 생성하고 업데이트합니다.

  • 페이지/동영상: 만들기, 삭제, 세부 정보, 편집 및 인덱스입니다.
  • Data/RazorPagesMovieContext.cs

Updated

  • Startup.cs

생성되고 업데이트된 파일은 다음 섹션에서 설명합니다.

초기 마이그레이션

이 섹션에서는 PMC(패키지 관리자 콘솔)를 사용하여 다음을 수행합니다.

  • 초기 마이그레이션을 추가합니다.
  • 초기 마이그레이션을 사용하여 데이터베이스를 업데이트합니다.

도구 메뉴에서 NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

PMC 메뉴

PMC에서 다음 명령을 입력합니다.

Add-Migration InitialCreate
Update-Database

위의 명령은 다음 경고를 생성합니다. "엔터티 형식 'Movie'의 10진수 열 'Price'에 대한 형식이 지정되지 않았습니다. 그러면 값이 기본 전체 자릿수 및 소수 자릿수에 적합하지 않은 경우 자동으로 잘립니다. 'HasColumnType()'를 사용하여 모든 값을 수용할 수 있는 SQL Server 열 형식을 명시적으로 지정합니다."

경고는 이후 단계에서 처리되므로 무시합니다.

migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.

update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 updateUp 파일에서 Migrations/<time-stamp>_InitialCreate.cs 메서드를 실행하여 데이터베이스를 만듭니다.

종속성 주입을 사용하여 등록된 컨텍스트 확인

ASP.NET Core는 종속성 주입을 사용하여 빌드됩니다. 서비스(예: EF Core 데이터베이스 컨텍스트)는 애플리케이션 시작 중에 종속성 주입에 등록됩니다. 이러한 서비스(예: Razor Pages)가 필요한 구성 요소는 생성자 매개 변수를 통해 제공됩니다. 데이터베이스 컨텍스트 인스턴스를 가져오는 생성자 코드는 자습서 뒷부분에 나옵니다.

스캐폴딩 도구는 자동으로 데이터베이스 컨텍스트를 생성하고 종속성 주입 컨테이너에 등록했습니다.

Startup.ConfigureServices 메서드를 검사합니다. 강조 표시된 줄은 스캐폴더에서 추가되었습니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

RazorPagesMovieContextMovie 모델에 대한 EF Core 기능(만들기, 읽기, 업데이트, 삭제)을 조정합니다. 데이터 컨텍스트(RazorPagesMovieContext)는 Microsoft.EntityFrameworkCore.DbContext에서 파생됩니다. 데이터 컨텍스트는 데이터 모델에 포함되는 엔터티를 지정합니다.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

이전 코드에서는 엔터티 집합에 대한 DbSet<Movie> 속성을 만듭니다. Entity Framework 용어에서 엔터티 집합은 일반적으로 데이터베이스 테이블에 해당합니다. 엔터티는 테이블의 행에 해당합니다.

DbContextOptions 개체에서 메서드를 호출하여 연결 문자열의 이름을 컨텍스트에 전달합니다. 로컬 개발의 경우 구성 시스템appsettings.json 파일에서 연결 문자열을 읽습니다.

앱 테스트

  • 앱을 실행하고 브라우저에서 URL에 /Movies를 추가합니다(http://localhost:port/movies).

경로를 찾을 수 없음

SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.

마이그레이션 단계를 누락했습니다.

  • Create 링크를 테스트합니다.

    만들기 페이지

    참고 항목

    Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.

  • Edit, DetailsDelete 링크를 테스트합니다.

다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.

다음 단계