Razor Pages에 대한 자습서 시리즈의 4부

참고 항목

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

Important

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

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

작성자: Joe Audette

RazorPagesMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 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();

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 구성은 appsettings.json 파일에서 연결 문자열을 가져옵니다.

생성된 연결 문자열은 다음 JSON과 유사합니다.

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

앱이 테스트 또는 프로덕션 서버에 배포되는 경우 환경 변수를 사용하여 연결 문자열을 테스트 또는 프로덕션 데이터베이스 서버로 설정할 수 있습니다. 자세한 내용은 구성을 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB는 프로그램 개발용으로 대상이 지정된 간단한 버전의 SQL Server Express 데이터베이스 엔진입니다. LocalDB는 요청 시 시작하고 사용자 모드에서 실행되므로 복잡한 구성이 없습니다. 기본적으로 LocalDB 데이터베이스는 C:\Users\<user>\ 디렉터리에서 *.mdf 파일을 만듭니다.

  1. 보기 메뉴에서 SSOX(SQL Server 개체 탐색기)를 엽니다.

    보기 메뉴

  2. Movie 테이블을 마우스 오른쪽 단추로 클릭하고 디자이너 보기를 선택합니다.

    동영상 테이블의 열린 바로 가기 메뉴

    디자이너에서 열린 동영상 테이블

    ID 옆의 키 아이콘을 확인합니다. 기본적으로 EF는 기본 키에 대해 ID라는 속성을 만듭니다.

  3. Movie 테이블을 마우스 오른쪽 단추로 클릭하고 데이터 보기를 선택합니다.

    테이블 데이터를 보여 주는 열린 Movie 테이블

데이터베이스 시드

다음 코드를 사용하여 Models 폴더에 SeedData라는 새 클래스를 만듭니다.

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }

            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },

                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },

                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },

                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

데이터베이스에 영화가 있는 경우 시드 이니셜라이저가 반환되고 영화가 추가되지 않습니다.

if (context.Movie.Any())
{
    return;
}

시드 이니셜라이저 추가

Program.cs 다음 강조 표시된 코드로 업데이트합니다.

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

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

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

이전 코드 Program.cs 에서는 다음을 수행하도록 수정되었습니다.

  • DI(종속성 주입) 컨테이너에서 데이터베이스 컨텍스트 인스턴스를 가져옵니다.
  • seedData.Initialize 메서드를 호출하여 데이터베이스 컨텍스트 인스턴스에 전달합니다.
  • 시드 메서드가 완료되면 컨텍스트를 삭제합니다. using 문은 컨텍스트가 삭제되도록 합니다.

Update-Database가 실행되지 않은 경우 다음 예외가 발생합니다.

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

앱 테스트

데이터베이스의 모든 레코드를 삭제하면 시드 메서드가 실행됩니다. 앱을 중지 및 시작하여 데이터베이스를 시드합니다. 데이터베이스가 시드되지 않은 경우 if (context.Movie.Any())에 중단점을 설정하고 코드를 단계별로 실행합니다.

앱에서 시드된 데이터를 보여 줍니다.

영화 데이터를 표시하는 Movie 애플리케이션이 열린 브라우저

다음 단계

RazorPagesMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 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();

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 구성은 appsettings.json 파일에서 연결 문자열을 가져옵니다.

생성된 연결 문자열은 다음 JSON과 유사합니다.

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

앱이 테스트 또는 프로덕션 서버에 배포되는 경우 환경 변수를 사용하여 연결 문자열을 테스트 또는 프로덕션 데이터베이스 서버로 설정할 수 있습니다. 자세한 내용은 구성을 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB는 프로그램 개발용으로 대상이 지정된 간단한 버전의 SQL Server Express 데이터베이스 엔진입니다. LocalDB는 요청 시 시작하고 사용자 모드에서 실행되므로 복잡한 구성이 없습니다. 기본적으로 LocalDB 데이터베이스는 C:\Users\<user>\ 디렉터리에서 *.mdf 파일을 만듭니다.

  1. 보기 메뉴에서 SSOX(SQL Server 개체 탐색기)를 엽니다.

    보기 메뉴

  2. Movie 테이블을 마우스 오른쪽 단추로 클릭하고 디자이너 보기를 선택합니다.

    동영상 테이블의 열린 바로 가기 메뉴

    디자이너에서 열린 동영상 테이블

    ID 옆의 키 아이콘을 확인합니다. 기본적으로 EF는 기본 키에 대해 ID라는 속성을 만듭니다.

  3. Movie 테이블을 마우스 오른쪽 단추로 클릭하고 데이터 보기를 선택합니다.

    테이블 데이터를 보여 주는 열린 Movie 테이블

데이터베이스 시드

다음 코드를 사용하여 Models 폴더에 SeedData라는 새 클래스를 만듭니다.

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }

            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },

                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },

                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },

                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

데이터베이스에 영화가 있는 경우 시드 이니셜라이저가 반환되고 영화가 추가되지 않습니다.

if (context.Movie.Any())
{
    return;
}

시드 이니셜라이저 추가

Program.cs 다음 강조 표시된 코드로 업데이트합니다.

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

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

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

이전 코드 Program.cs 에서는 다음을 수행하도록 수정되었습니다.

  • DI(종속성 주입) 컨테이너에서 데이터베이스 컨텍스트 인스턴스를 가져옵니다.
  • seedData.Initialize 메서드를 호출하여 데이터베이스 컨텍스트 인스턴스에 전달합니다.
  • 시드 메서드가 완료되면 컨텍스트를 삭제합니다. using 문은 컨텍스트가 삭제되도록 합니다.

Update-Database가 실행되지 않은 경우 다음 예외가 발생합니다.

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

앱 테스트

데이터베이스의 모든 레코드를 삭제하면 시드 메서드가 실행됩니다. 앱을 중지 및 시작하여 데이터베이스를 시드합니다. 데이터베이스가 시드되지 않은 경우 if (context.Movie.Any())에 중단점을 설정하고 코드를 단계별로 실행합니다.

앱에서 시드된 데이터를 보여 줍니다.

영화 데이터를 표시하는 Movie 애플리케이션이 열린 브라우저

다음 단계

RazorPagesMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 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();

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 구성은 appsettings.json 파일에서 연결 문자열을 가져옵니다.

생성된 연결 문자열은 다음 JSON과 유사합니다.

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

앱이 테스트 또는 프로덕션 서버에 배포되는 경우 환경 변수를 사용하여 연결 문자열을 테스트 또는 프로덕션 데이터베이스 서버로 설정할 수 있습니다. 자세한 내용은 구성을 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB는 프로그램 개발용으로 대상이 지정된 간단한 버전의 SQL Server Express 데이터베이스 엔진입니다. LocalDB는 요청 시 시작하고 사용자 모드에서 실행되므로 복잡한 구성이 없습니다. 기본적으로 LocalDB 데이터베이스는 C:\Users\<user>\ 디렉터리에서 *.mdf 파일을 만듭니다.

  1. 보기 메뉴에서 SSOX(SQL Server 개체 탐색기)를 엽니다.

    보기 메뉴

  2. Movie 테이블을 마우스 오른쪽 단추로 클릭하고 디자이너 보기를 선택합니다.

    동영상 테이블의 열린 바로 가기 메뉴

    디자이너에서 열린 동영상 테이블

    ID 옆의 키 아이콘을 확인합니다. 기본적으로 EF는 기본 키에 대해 ID라는 속성을 만듭니다.

  3. Movie 테이블을 마우스 오른쪽 단추로 클릭하고 데이터 보기를 선택합니다.

    테이블 데이터를 보여 주는 열린 Movie 테이블

데이터베이스 시드

다음 코드를 사용하여 Models 폴더에 SeedData라는 새 클래스를 만듭니다.

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                if (context == null || context.Movie == null)
                {
                    throw new ArgumentNullException("Null RazorPagesMovieContext");
                }

                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

데이터베이스에 영화가 있는 경우 시드 이니셜라이저가 반환되고 영화가 추가되지 않습니다.

if (context.Movie.Any())
{
    return;
}

시드 이니셜라이저 추가

Program.cs 다음 강조 표시된 코드로 업데이트합니다.

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

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

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

이전 코드 Program.cs 에서는 다음을 수행하도록 수정되었습니다.

  • DI(종속성 주입) 컨테이너에서 데이터베이스 컨텍스트 인스턴스를 가져옵니다.
  • seedData.Initialize 메서드를 호출하여 데이터베이스 컨텍스트 인스턴스에 전달합니다.
  • 시드 메서드가 완료되면 컨텍스트를 삭제합니다. using 문은 컨텍스트가 삭제되도록 합니다.

Update-Database가 실행되지 않은 경우 다음 예외가 발생합니다.

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

앱 테스트

데이터베이스의 모든 레코드를 삭제하면 시드 메서드가 실행됩니다. 앱을 중지 및 시작하여 데이터베이스를 시드합니다. 데이터베이스가 시드되지 않은 경우 if (context.Movie.Any())에 중단점을 설정하고 코드를 단계별로 실행합니다.

앱에서 시드된 데이터를 보여 줍니다.

영화 데이터를 표시하는 Movie 애플리케이션이 열린 브라우저

다음 단계

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

RazorPagesMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 Startup.csConfigureServices 메서드에서 종속성 주입 컨테이너에 등록됩니다.

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

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

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 구성은 appsettings.json 파일에서 연결 문자열을 가져옵니다.

생성된 연결 문자열은 다음 JSON과 유사합니다.

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

앱이 테스트 또는 프로덕션 서버에 배포되는 경우 환경 변수를 사용하여 연결 문자열을 테스트 또는 프로덕션 데이터베이스 서버로 설정할 수 있습니다. 자세한 내용은 구성을 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB는 프로그램 개발용으로 대상이 지정된 간단한 버전의 SQL Server Express 데이터베이스 엔진입니다. LocalDB는 요청 시 시작하고 사용자 모드에서 실행되므로 복잡한 구성이 없습니다. 기본적으로 LocalDB 데이터베이스는 C:\Users\<user>\ 디렉터리에서 *.mdf 파일을 만듭니다.

  1. 보기 메뉴에서 SSOX(SQL Server 개체 탐색기)를 엽니다.

    보기 메뉴

  2. Movie 테이블을 마우스 오른쪽 단추로 클릭하고 디자이너 보기를 선택합니다.

    동영상 테이블의 열린 바로 가기 메뉴

    디자이너에서 열린 동영상 테이블

    ID 옆의 키 아이콘을 확인합니다. 기본적으로 EF는 기본 키에 대해 ID라는 속성을 만듭니다.

  3. Movie 테이블을 마우스 오른쪽 단추로 클릭하고 데이터 보기를 선택합니다.

    테이블 데이터를 보여 주는 열린 Movie 테이블

데이터베이스 시드

다음 코드를 사용하여 Models 폴더에 SeedData라는 새 클래스를 만듭니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

데이터베이스에 영화가 있는 경우 시드 이니셜라이저가 반환되고 영화가 추가되지 않습니다.

if (context.Movie.Any())
{
    return;
}

시드 이니셜라이저 추가

Program.cs의 내용을 다음 코드로 바꿉니다.

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;

namespace RazorPagesMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    SeedData.Initialize(services);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }

            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

위의 코드에서 다음을 수행하도록 Main 메서드가 수정되었습니다.

  • 종속성 주입 컨테이너에서 데이터베이스 컨텍스트 인스턴스를 가져옵니다.
  • seedData.Initialize 메서드를 호출하여 데이터베이스 컨텍스트 인스턴스에 전달합니다.
  • 시드 메서드가 완료되면 컨텍스트를 삭제합니다. using 문은 컨텍스트가 삭제되도록 합니다.

Update-Database가 실행되지 않은 경우 다음 예외가 발생합니다.

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

앱 테스트

  1. 데이터베이스의 모든 레코드를 삭제합니다. 브라우저에서 또는 SSOX에서 삭제 링크를 사용합니다.

  2. Startup 클래스에서 메서드를 호출하여 앱을 강제로 초기화하면 시드 메서드가 실행됩니다. 초기화를 적용하려면 IIS Express를 중지하고 다시 시작해야 합니다. 다음 중 한 가지 방법을 사용하여 IIS를 중지했다가 다시 시작합니다.

    1. 알림 영역에서 IIS Express 시스템 트레이 아이콘을 마우스 오른쪽 단추로 클릭하고 종료 또는 사이트 중지를 선택합니다.

      IIS Express 시스템 트레이 아이콘

      상황별 메뉴

    2. 앱이 비디버그 모드에서 실행 중인 경우 F5를 눌러 디버그 모드에서 실행합니다.

    3. 앱이 디버그 모드인 경우 디버거를 중지하고 F5를 누릅니다.

앱에서 시드된 데이터를 보여 줍니다.

영화 데이터를 표시하는 Movie 애플리케이션이 열린 브라우저

다음 단계

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

RazorPagesMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 Startup.csConfigureServices 메서드에서 종속성 주입 컨테이너에 등록됩니다.

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

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

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 구성은 appsettings.json 파일에서 연결 문자열을 가져옵니다.

생성된 연결 문자열은 다음과 유사합니다.

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

앱이 테스트 또는 프로덕션 서버에 배포되는 경우 환경 변수를 사용하여 연결 문자열을 테스트 또는 프로덕션 데이터베이스 서버로 설정할 수 있습니다. 자세한 내용은 구성을 참조하세요.

SQL Server Express LocalDB

LocalDB는 프로그램 개발용으로 대상이 지정된 간단한 버전의 SQL Server Express 데이터베이스 엔진입니다. LocalDB는 요청 시 시작하고 사용자 모드에서 실행되므로 복잡한 구성이 없습니다. 기본적으로 LocalDB 데이터베이스는 C:\Users\<user>\ 디렉터리에서 *.mdf 파일을 만듭니다.

  • 보기 메뉴에서 SSOX(SQL Server 개체 탐색기)를 엽니다.

    보기 메뉴

  • Movie 테이블을 마우스 오른쪽 단추로 클릭하고 디자이너 보기를 선택합니다.

    동영상 테이블의 열린 바로 가기 메뉴

    디자이너에서 열린 동영상 테이블

ID 옆의 키 아이콘을 확인합니다. 기본적으로 EF는 기본 키에 대해 ID라는 속성을 만듭니다.

  • Movie 테이블을 마우스 오른쪽 단추로 클릭하고 데이터 보기를 선택합니다.

    테이블 데이터를 보여 주는 열린 Movie 테이블

데이터베이스 시드

다음 코드를 사용하여 Models 폴더에 SeedData라는 새 클래스를 만듭니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

데이터베이스에 영화가 있는 경우 시드 이니셜라이저가 반환되고 영화가 추가되지 않습니다.

if (context.Movie.Any())
{
    return;
}

시드 이니셜라이저 추가

Program.cs의 내용을 다음 코드로 바꿉니다.

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;

namespace RazorPagesMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    SeedData.Initialize(services);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }
            
            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

위의 코드에서 다음을 수행하도록 Main 메서드가 수정되었습니다.

  • 종속성 주입 컨테이너에서 데이터베이스 컨텍스트 인스턴스를 가져옵니다.
  • seedData.Initialize 메서드를 호출하여 데이터베이스 컨텍스트 인스턴스에 전달합니다.
  • 시드 메서드가 완료되면 컨텍스트를 삭제합니다. using 문은 컨텍스트가 삭제되도록 합니다.

Update-Database가 실행되지 않은 경우 다음 예외가 발생합니다.

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

앱 테스트

  • 데이터베이스의 모든 레코드를 삭제합니다. 브라우저에서 또는 SSOX에서 삭제 링크를 사용합니다.

  • Startup 클래스에서 메서드를 호출하여 앱을 강제로 초기화하면 시드 메서드가 실행됩니다. 초기화를 적용하려면 IIS Express를 중지하고 다시 시작해야 합니다. 다음 중 한 가지 방법을 사용하여 IIS를 중지했다가 다시 시작합니다.

    • 알림 영역에서 IIS Express 시스템 트레이 아이콘을 마우스 오른쪽 단추로 클릭하고 종료 또는 사이트 중지를 탭합니다.

      IIS Express 시스템 트레이 아이콘

      상황별 메뉴

      • 앱이 비디버그 모드에서 실행 중인 경우 F5를 눌러 디버그 모드에서 실행합니다.
      • 앱이 디버그 모드인 경우 디버거를 중지하고 F5를 누릅니다.

앱에서 시드된 데이터를 보여 줍니다.

동영상 데이터를 표시하는 크롬에서 열린 동영상 애플리케이션

다음 단계