이 자습서에서는 데이터베이스에서 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다. 먼저 모델 클래스를 작성하면 EF Core 가 데이터베이스를 만듭니다.
모델 클래스는 종속성이 EF Core없으므로 POCO 클래스("Plain-O ld CLR Objects")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.
솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.
Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.
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 참조 형식을 참조하세요.
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 참조 형식을 참조하세요.
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();
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.UseSqlite(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.MapStaticAssets();
app.MapRazorPages();
app.Run();
변경 내용은 Program.cs 이 자습서의 뒷부분에 설명되어 있습니다.
EF의 마이그레이션 기능을 사용하여 초기 데이터베이스 스키마 만들기
Entity Framework Core의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.
초기 데이터베이스 스키마를 만듭니다.
데이터베이스 스키마를 증분 업데이트하여 앱의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.
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 메서드를 실행합니다. 이 경우 명령은 파일에서 메서드를 UpMigrations/<time-stamp>_InitialCreate.cs 실행하여 데이터베이스를 만듭니다.
RazorPagesMovie.csproj 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 통합 터미널에서 열기를 선택합니다.
프로젝트 디렉터리에서 Program.cs 및 .csproj 파일이 포함된 명령 프롬프트가 있는 터미널 창이 열립니다.
다음 .NET CLI 명령을 실행합니다.
dotnet ef migrations add InitialCreate
migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.
다음 .NET CLI 명령을 실행합니다.
dotnet ef database update
update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 update는 Migrations/<time-stamp>_InitialCreate.cs 파일에서 Up 메서드를 실행하여 데이터베이스를 만듭니다.
참고 항목
SQLite의 경우 Price 필드의 열 유형은 TEXT로 설정됩니다. 이 내용은 이후 단계에서 확인됩니다.
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 파일에서 연결 문자열을 읽습니다.
Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.
Edit, Details 및 Delete 링크를 테스트합니다.
다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.
종속성 주입을 사용하여 등록된 컨텍스트 확인
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();
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.UseSqlite(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.MapStaticAssets();
app.MapRazorPages();
app.Run();
이 자습서에서는 데이터베이스에서 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다. 먼저 모델 클래스를 작성하면 EF Core 가 데이터베이스를 만듭니다.
모델 클래스는 종속성이 EF Core없으므로 POCO 클래스("Plain-O ld CLR Objects")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.
솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.
Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.
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 참조 형식을 참조하세요.
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 참조 형식을 참조하세요.
Visual Studio Code에서 Ctrl+F5(Windows) 또는 ⌘+F5(macOS)를 눌러 디버깅하지 않고 앱을 실행합니다.
편집기 영역 아래의 패널에서 문제 탭을 선택하거나 보기 메뉴에서 현재 보기에 없는 경우 문제를 선택합니다. 컴파일 오류가 없는지 확인합니다.
솔루션 도구 창에서 RazorPagesMovie 프로젝트를 제어하여 클릭한 다음 새 폴더 추가>...를 선택합니다. 폴더 이름을 지정합니다Models.
Models 폴더를 Ctrl + 클릭하고 추가>새 클래스...를 선택합니다.
새 파일 대화 상자에서:
왼쪽 창에서 일반을 선택합니다.
가운데 창에서 빈 클래스를 선택합니다.
클래스 이름을 Movie로 지정하고 만들기를 선택합니다.
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] 특성입니다. 이 특성을 사용하면:
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.
초기 데이터베이스 스키마를 만듭니다.
데이터베이스 스키마를 증분 업데이트하여 앱의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.
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 메서드를 실행합니다. 이 경우 명령은 파일에서 메서드를 UpMigrations/<time-stamp>_InitialCreate.cs 실행하여 데이터베이스를 만듭니다.
RazorPagesMovie.csproj 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 통합 터미널에서 열기를 선택합니다.
프로젝트 디렉터리에서 Program.cs 및 .csproj 파일이 포함된 명령 프롬프트가 있는 터미널 창이 열립니다.
다음 .NET CLI 명령을 실행합니다.
dotnet ef migrations add InitialCreate
migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.
다음 .NET CLI 명령을 실행합니다.
dotnet ef database update
update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 update는 Migrations/<time-stamp>_InitialCreate.cs 파일에서 Up 메서드를 실행하여 데이터베이스를 만듭니다.
참고 항목
SQLite의 경우 Price 필드의 열 유형은 TEXT로 설정됩니다. 이 내용은 이후 단계에서 확인됩니다.
Control 키를 누른 상태로 RazorPagesMovie 프로젝트를 클릭한 다음 터미널에서 열기를 선택합니다.
프로젝트 디렉터리에서 Program.cs 및 .csproj 파일이 포함된 명령 프롬프트가 있는 터미널 창이 열립니다.
다음 .NET CLI 명령을 실행합니다.
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.
update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 update는 Migrations/<time-stamp>_InitialCreate.cs 파일에서 Up 메서드를 실행하여 데이터베이스를 만듭니다.
참고 항목
SQLite의 경우 Price 필드의 열 유형은 TEXT로 설정됩니다. 이 내용은 이후 단계에서 확인됩니다.
다음 경고가 표시됩니다. 이 경고는 이후 단계에서 해결됩니다.
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()’.
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 파일에서 연결 문자열을 읽습니다.
Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.
Edit, Details 및 Delete 링크를 테스트합니다.
다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.
종속성 주입을 사용하여 등록된 컨텍스트 확인
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.
솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.
Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.
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 참조 형식을 참조하세요.
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 참조 형식을 참조하세요.
Visual Studio Code에서 Ctrl+F5(Windows) 또는 ⌘+F5(macOS)를 눌러 디버깅하지 않고 앱을 실행합니다.
편집기 영역 아래의 패널에서 문제 탭을 선택하거나 보기 메뉴에서 현재 보기에 없는 경우 문제를 선택합니다. 컴파일 오류가 없는지 확인합니다.
솔루션 도구 창에서 RazorPagesMovie 프로젝트를 제어하여 클릭한 다음 새 폴더 추가>...를 선택합니다. 폴더 이름을 지정합니다Models.
Models 폴더를 Ctrl + 클릭하고 추가>새 클래스...를 선택합니다.
새 파일 대화 상자에서:
왼쪽 창에서 일반을 선택합니다.
가운데 창에서 빈 클래스를 선택합니다.
클래스 이름을 Movie로 지정하고 만들기를 선택합니다.
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] 특성입니다. 이 특성을 사용하면:
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.
초기 데이터베이스 스키마를 만듭니다.
데이터베이스 스키마를 증분 업데이트하여 앱의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.
Add-Migration 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.
Update-Database 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 명령은 파일에서 메서드를 UpMigrations/<time-stamp>_InitialCreate.cs 실행하여 데이터베이스를 만듭니다.
RazorPagesMovie.csproj 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 통합 터미널에서 열기를 선택합니다.
프로젝트 디렉터리에서 Program.cs 및 .csproj 파일이 포함된 명령 프롬프트가 있는 터미널 창이 열립니다.
다음 .NET CLI 명령을 실행합니다.
dotnet ef migrations add InitialCreate
dotnet ef database update
migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.
update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 update는 Migrations/<time-stamp>_InitialCreate.cs 파일에서 Up 메서드를 실행하여 데이터베이스를 만듭니다.
참고 항목
SQLite의 경우 Price 필드의 열 유형은 TEXT로 설정됩니다. 이 내용은 이후 단계에서 확인됩니다.
Control 키를 누른 상태로 RazorPagesMovie 프로젝트를 클릭한 다음 터미널에서 열기를 선택합니다.
프로젝트 디렉터리에서 Program.cs 및 .csproj 파일이 포함된 명령 프롬프트가 있는 터미널 창이 열립니다.
다음 .NET CLI 명령을 실행합니다.
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.
update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 update는 Migrations/<time-stamp>_InitialCreate.cs 파일에서 Up 메서드를 실행하여 데이터베이스를 만듭니다.
참고 항목
SQLite의 경우 Price 필드의 열 유형은 TEXT로 설정됩니다. 이 내용은 이후 단계에서 확인됩니다.
다음 경고가 표시됩니다. 이 경고는 이후 단계에서 해결됩니다.
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()’.
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 파일에서 연결 문자열을 읽습니다.
Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.
Edit, Details 및 Delete 링크를 테스트합니다.
다음 자습서에서는 스캐폴딩을 통해 만들어진 파일을 설명합니다.
종속성 주입을 사용하여 등록된 컨텍스트 확인
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.
솔루션 탐색기 RazorPagesMovie 프로젝트 >새 폴더 추가를 마우스 오른쪽 단추로>클릭합니다. 폴더 이름을 Models로 지정합니다.
Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 클래스의 이름을 Movie로 지정합니다.
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] 특성입니다. 이 특성을 사용하면:
사용자가 날짜 필드에 시간 정보를 입력할 필요가 없습니다.
시간 정보 없이 날짜만 표시됩니다.
Models 폴더를 추가합니다.
라는 Movie.cs폴더에 클래스를 Models 추가합니다.
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] 특성입니다. 이 특성을 사용하면:
솔루션 도구 창에서 RazorPagesMovie 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 새 폴더 추가>...를 선택합니다. 폴더 이름을 지정합니다Models.
Models 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 파일...을 선택합니다.
새 파일 대화 상자에서:
왼쪽 창에서 일반을 선택합니다.
가운데 창에서 빈 클래스를 선택합니다.
클래스 이름을 Movie로 지정하고 만들기를 선택합니다.
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] 특성입니다. 이 특성을 사용하면:
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();
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.UseSqlite(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의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.
초기 데이터베이스 스키마를 만듭니다.
데이터베이스 스키마를 증분 업데이트하여 앱의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.
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 메서드를 실행합니다. 이 경우 update는 Migrations/<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();
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.UseSqlite(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();
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 파일에서 연결 문자열을 읽습니다.
이 섹션에서는 데이터베이스에서 동영상을 관리하기 위한 클래스를 추가합니다. 이 앱의 모델 클래스는 Entity Framework Core(EF Core)를 사용하여 데이터베이스 작업을 수행합니다. EF Core는 데이터 액세스를 간소화하는 O/RM(개체-관계형 매퍼)입니다. 먼저 모델 클래스를 작성하면 EF Core 가 데이터베이스를 만듭니다.
모델 클래스는 종속성이 EF Core없으므로 POCO 클래스("Plain-O ld CLR Objects")라고 합니다. 이 클래스는 데이터베이스에 저장되는 데이터의 속성을 정의합니다.
솔루션 탐색기 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)을 지정합니다. 이 특성을 사용하면:
사용자가 날짜 필드에 시간 정보를 입력할 필요가 없습니다.
시간 정보 없이 날짜만 표시됩니다.
Models 폴더를 추가합니다.
라는 Movie.cs폴더에 클래스를 Models 추가합니다.
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)을 지정합니다. 이 특성을 사용하면:
솔루션 도구 창에서 RazorPagesMovie 프로젝트를 제어하여 클릭한 다음 새 폴더 추가>...를 선택합니다. 폴더 이름을 지정합니다Models.
Models 폴더를 Ctrl + 클릭하고 추가>새 파일...을 선택합니다.
새 파일 대화 상자에서:
왼쪽 창에서 일반을 선택합니다.
가운데 창에서 빈 클래스를 선택합니다.
클래스 이름을 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)을 지정합니다. 이 특성을 사용하면:
SQLite를 선택하면 개발용 템플릿 생성 코드가 준비됩니다. 다음 코드는 Startup에 IWebHostEnvironment를 주입하는 방법을 보여 줍니다. IWebHostEnvironment는 ConfigureServices가 SQLite를 사용하고 프로덕션에서 SQL Server를 사용할 수 있도록 주입됩니다.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Pages/Movies 폴더를 만듭니다.
Pages 폴더를 Ctrl + 클릭하고 추가>새 폴더를 선택합니다.
폴더 이름을 Movies로 지정합니다.
Pages/Movies 폴더를 Ctrl + 클릭하고 추가 >새 스캐폴딩...을 선택합니다.
새 스캐폴딩 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>다음을 선택합니다.
Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.
사용할 DbContext 클래스: 행에서 클래스 이름을 RazorPagesMovie.Data.RazorPagesMovieContext로 지정합니다.
마침을 선택합니다.
appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.
개발에 SQLite를 사용하고 프로덕션에 SQL Server를 사용
SQLite를 선택하면 개발용 템플릿 생성 코드가 준비됩니다. 다음 코드는 Startup에 IWebHostEnvironment를 주입하는 방법을 보여 줍니다. IWebHostEnvironment는 ConfigureServices가 SQLite를 사용하고 프로덕션에서 SQL Server를 사용할 수 있도록 주입됩니다.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Warning
이 문서에서는 사용자를 인증할 필요가 없는 로컬 데이터베이스를 사용합니다. 프로덕션 앱은 사용 가능한 가장 안전한 인증 흐름을 사용해야 합니다. 배포된 테스트 및 프로덕션 앱의 인증에 대한 자세한 내용은 보안 인증 흐름을 참조 하세요.
파일이 생성 및 업데이트됨
스캐폴드 프로세스는 다음 파일을 만듭니다.
페이지/동영상: 만들기, 삭제, 세부 정보, 편집 및 인덱스입니다.
Data/RazorPagesMovieContext.cs
업데이트된 파일
Startup.cs
생성되고 업데이트된 파일은 다음 섹션에서 설명합니다.
EF의 마이그레이션 기능을 사용하여 초기 데이터베이스 스키마 만들기
Entity Framework Core의 마이그레이션 기능은 다음을 수행하는 방법을 제공합니다.
초기 데이터베이스 스키마를 만듭니다.
데이터베이스 스키마를 증분 방식으로 업데이트하여 애플리케이션의 데이터 모델과 동기화된 상태로 유지합니다. 데이터베이스의 기존 데이터는 그대로 유지됩니다.
dotnet ef migrations add InitialCreate
dotnet ef database update
참고 항목
SQLite의 경우 Price 필드의 열 유형은 TEXT로 설정됩니다. 이 내용은 이후 단계에서 확인됩니다.
SQL Server의 경우 이전 명령은 다음 경고를 생성합니다. "엔터티 형식 'Movie'에서 10진수 열 'Price'의 형식이 지정되지 않았습니다. 그러면 값이 기본 전체 자릿수 및 소수 자릿수에 적합하지 않은 경우 자동으로 잘립니다. 'HasColumnType()'를 사용하여 모든 값을 수용할 수 있는 SQL Server 열 형식을 명시적으로 지정합니다."
경고는 이후 단계에서 처리되므로 무시합니다.
migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.
update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 update는 Migrations/<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")));
}
RazorPagesMovieContext는 Movie 모델에 대한 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 파일에서 연결 문자열을 읽습니다.
Price 필드에 소수점을 입력하지 못할 수도 있습니다. 소수점으로 쉼표(",")를 사용하는 비 영어 로캘 및 비 US-English 날짜 형식에 대해jQuery 유효성 검사를 지원하려면 앱을 세계화해야 합니다. 세계화 지침은 이 GitHub 문제를 참조하세요.
Edit, Details 및 Delete 링크를 테스트합니다.
Entity Framework Core의 SQL 로깅
로깅 구성은 일반적으로 appsettings.{Environment}.json 파일의 Logging 섹션에서 제공됩니다. SQL 문을 로깅하려면 "Microsoft.EntityFrameworkCore.Database.Command": "Information"을 appsettings.Development.json 파일에 추가합니다.
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)을 지정합니다. 이 특성을 사용하면:
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)을 지정합니다. 이 특성을 사용하면:
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 속성을 만듭니다. Entity Framework 용어에서 엔터티 집합은 일반적으로 데이터베이스 테이블에 해당하고 엔터티는 테이블의 행에 해당합니다. 이후 단계에서 종속성이 추가될 때까지 코드는 컴파일되지 않습니다.
데이터베이스 연결 문자열 추가
강조 표시된 아래 코드와 같이 appsettings.json 파일에 연결 문자열을 추가합니다.
using RazorPagesMovie.Data;
using Microsoft.EntityFrameworkCore;
데이터베이스 컨텍스트를 Startup.ConfigureServices의 종속성 주입 컨테이너에 등록합니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
솔루션 도구 창에서 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)을 지정합니다. 이 특성을 사용하면:
Pages/Movies 폴더를 마우스 오른쪽 단추로 클릭하고 추가>스캐폴드 항목 새로 만들기를 선택합니다.
스캐폴드 추가 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>추가를 선택합니다.
Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.
모델 클래스 드롭다운에서 동영상(RazorPagesMovie.Models)을 선택합니다.
데이터 컨텍스트 클래스 행에서 (더하기) 기호를 + 선택하고 RazorPagesMovieModels에서 생성된 이름을 변경합니다. RazorPagesMovieContext에서 RazorPagesMovie로.데이터입니다. RazorPagesMovieContext. 이 변경은 필수는 아닙니다. 올바른 네임스페이스를 사용하여 데이터베이스 컨텍스트 클래스를 만듭니다.
추가를 선택합니다.
appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.
Program.cs, Startup.cs, .csproj 파일이 포함된 프로젝트 디렉터리에서 명령 창을 엽니다.
SQLite를 선택하면 개발용 템플릿 생성 코드가 준비됩니다. 다음 코드에서는 시작에 IWebHostEnvironment를 주입하는 방법을 보여줍니다. IWebHostEnvironment는 ConfigureServices가 SQLite를 사용하고 프로덕션에서 SQL Server를 사용할 수 있도록 주입됩니다.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Pages/Movies 폴더를 만듭니다.
Pages 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 폴더를 선택합니다.
폴더 이름을 Movies로 지정합니다.
Pages/Movies 폴더를 마우스 오른쪽 단추로 클릭하고 추가>새 스캐폴딩...을 선택합니다.
새 스캐폴딩 대화 상자에서 Entity Framework를 사용한 Razor Pages(CRUD)>다음을 선택합니다.
Entity Framework(CRUD)를 사용하여 Razor Pages 추가 대화 상자를 완료합니다.
모델 클래스 드롭다운에서 동영상(RazorPagesMovie.Models)을 선택하거나 입력합니다.
데이터 컨텍스트 클래스 행에 새 클래스의 이름 RazorPagesMovie.Data.RazorPagesMovieContext를 입력합니다. 이 변경은 필수는 아닙니다. 올바른 네임스페이스를 사용하여 데이터베이스 컨텍스트 클래스를 만듭니다.
추가를 선택합니다.
appsettings.json 파일이 로컬 데이터베이스에 연결하는 데 사용된 연결 문자열로 업데이트됩니다.
SQLite를 선택하면 개발용 템플릿 생성 코드가 준비됩니다. 다음 코드에서는 시작에 IWebHostEnvironment를 주입하는 방법을 보여줍니다. IWebHostEnvironment는 ConfigureServices가 SQLite를 사용하고 프로덕션에서 SQL Server를 사용할 수 있도록 주입됩니다.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
dotnet ef migrations add InitialCreate
dotnet ef database update
위의 명령은 다음 경고를 생성합니다. "엔터티 형식 'Movie'의 10진수 열 'Price'에 대한 형식이 지정되지 않았습니다. 그러면 값이 기본 전체 자릿수 및 소수 자릿수에 적합하지 않은 경우 자동으로 잘립니다. 'HasColumnType()'를 사용하여 모든 값을 수용할 수 있는 SQL Server 열 형식을 명시적으로 지정합니다."
경고는 이후 단계에서 처리되므로 무시합니다.
migrations 명령은 초기 데이터베이스 스키마를 만드는 코드를 생성합니다. 이 스키마는 DbContext에 지정된 모델을 기반으로 합니다. InitialCreate 인수는 마이그레이션 이름을 지정하는 데 사용됩니다. 모든 이름을 사용할 수 있지만 규칙에 따라 마이그레이션을 설명하는 이름을 선택합니다.
update 명령은 적용되지 않은 마이그레이션에서 Up 메서드를 실행합니다. 이 경우 update 는 Up 파일에서 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")));
}
RazorPagesMovieContext는 Movie 모델에 대한 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 파일에서 연결 문자열을 읽습니다.