다음을 통해 공유


7부. ASP.NET Core의 Razor Page에 새 필드 추가

참고 항목

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

Warning

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

Important

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

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

작성자: Rick Anderson

이 섹션에서 는 Entity Framework Core(EF Core) 를 사용하여 앱의 모델 클래스를 기반으로 데이터베이스 스키마를 정의합니다.

  • 모델에 새 필드를 추가합니다.
  • 데이터베이스로 새 필드 스키마 변경 내용을 마이그레이션합니다.

이 EF Core 접근 방식을 사용하면 더 민첩한 개발 프로세스를 사용할 수 있습니다. 개발자는 데이터베이스 스키마를 만든 다음 동기화하는 동안 앱의 데이터 모델에서 직접 작업하며, 개발자는 datbase 관리 도구로 컨텍스트를 전환할 필요 없이 작업합니다. Entity Framework Core 및 해당 이점에 대한 개요는 Entity Framework Core를 참조하세요.

EF Code를 사용하여 데이터베이스를 자동으로 만들고 추적합니다.

  • 데이터베이스에 __EFMigrationsHistory 테이블을 추가하여 데이터베이스의 스키마가 생성된 모델 클래스와 동기화되어 있는지 여부를 추적합니다.
  • 모델 클래스가 데이터베이스와 동기화되지 않으면 예외를 throw합니다.

스키마와 모델의 동기화를 자동 확인하면 일관성이 없는 데이터베이스 코드 문제를 쉽게 찾을 수 있습니다.

동영상 모델에 등급 속성 추가

  1. Models/Movie.cs 파일을 열고 속성을 추가합니다.Rating

    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Pages/Movies/Index.cshtml을 편집하고 Rating 필드를 추가합니다.

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            <label>Title: <input type="text" asp-for="SearchString" /></label>
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Rating 필드를 사용하여 다음 페이지를 업데이트합니다.

새 필드를 포함하도록 데이터베이스가 업데이트될 때까지 앱은 작동하지 않습니다. 데이터베이스를 업데이트하지 않고 앱을 실행하면 SqlException이 throw됩니다.

SqlException: Invalid column name 'Rating'.

SqlException 예외는 업데이트된 영화 모델 클래스가 데이터베이스의 영화 테이블의 스키마와 다르면 발생합니다. 데이터베이스 테이블에 Rating 열이 없습니다.

이 오류를 해결할 수 있는 몇 가지 방법이 있습니다.

  1. 새 모델 클래스 스키마를 사용하여 Entity Framework를 자동으로 삭제하고 데이터베이스를 다시 만듭니다. 이 방법은 개발 주기의 초기 단계에서 편리하며, 개발자는 신속하게 모델 및 데이터베이스 스키마를 함께 개발할 수 있습니다. 단점은 데이터베이스의 기존 데이터를 잃게 된다는 것입니다. 프로덕션 데이터베이스에서 이 방법을 사용하지 마세요. 테스트 데이터로 데이터베이스를 자동으로 시드하도록 스키마 변경 시 데이터베이스를 삭제하고 이니셜라이저를 사용하는 것은 종종 앱을 개발하는 효율적인 방법입니다.
  2. 모델 클래스와 일치하도록 기존 데이터베이스의 스키마를 명시적으로 수정합니다. 이 방법의 장점은 데이터가 유지된다는 점입니다. 이러한 변경을 수동으로 수행하거나 데이터베이스 변경 스크립트를 만들어 수행합니다.
  3. 마이그레이션을 사용하여 EF Core 데이터베이스 스키마를 업데이트합니다.

이 자습서에서는 마이그레이션을 사용합니다 EF Core .

새 열에 대한 값을 제공하도록 SeedData 클래스를 수정합니다. 아래에 샘플 변경이 나와 있지만 new Movie 블록마다 이 변경을 수행하세요.

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

완료된 SeedData.cs 파일을 참조하세요.

앱 빌드

Ctrl Shift B를+누릅니다.+

등급 필드에 대한 마이그레이션을 추가합니다.

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

  2. PMC(패키지 관리자 콘솔)에서 다음 명령을 입력합니다.

    Add-Migration Rating
    

Add-Migration 명령은 프레임워크에 다음 작업을 지시합니다.

  • Movie 모델을 Movie 데이터베이스 스키마와 비교합니다.
  • 데이터베이스 스키마를 새 모델로 마이그레이션하도록 코드를 작성합니다.

"Rating" 이름은 임의로 지정되며 마이그레이션 파일의 이름을 지정하는 데 사용됩니다. 마이그레이션 파일에 의미 있는 이름을 사용하는 것이 좋습니다.

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

    Update-Database
    

Update-Database 명령은 프레임워크에게 스키마 변경 내용을 데이터베이스에 적용하고 기존 데이터를 보존하라고 명령합니다.

데이터베이스의 모든 레코드를 삭제하면 이니셜라이저가 데이터베이스를 시드하고 Rating 필드를 포함합니다. 브라우저 또는 SSOX(SQL Server 개체 탐색기)에서 삭제 링크를 사용하여 삭제를 수행할 수 있습니다.

다른 옵션은 데이터베이스를 삭제하고 마이그레이션을 사용하여 데이터베이스를 다시 만드는 것입니다. SSOX에서 데이터베이스를 삭제하려면:

  1. SSOX에서 데이터베이스를 선택합니다.

  2. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  3. 기존 연결 닫기를 선택합니다.

  4. 확인을 선택합니다.

  5. PMC에서 데이터베이스를 업데이트합니다.

    Update-Database
    

앱을 실행하고 Rating 필드를 사용하여 영화를 생성, 편집, 표시할 수 있는지 확인합니다. 데이터베이스가 시드되지 않은 경우 SeedData.Initialize 메서드에서 중단점을 설정합니다.

다음 단계

이 섹션에서는 Entity Framework Code First 마이그레이션으로 다음 작업을 수행합니다.

  • 모델에 새 필드를 추가합니다.
  • 데이터베이스로 새 필드 스키마 변경 내용을 마이그레이션합니다.

EF Code First를 사용하여 자동으로 데이터베이스를 만들고 추적할 경우 Code First는:

  • 데이터베이스에 __EFMigrationsHistory 테이블을 추가하여 데이터베이스의 스키마가 생성된 모델 클래스와 동기화되어 있는지 여부를 추적합니다.
  • 모델 클래스가 데이터베이스와 동기화되지 않으면 예외를 throw합니다.

스키마와 모델의 동기화를 자동 확인하면 일관성이 없는 데이터베이스 코드 문제를 쉽게 찾을 수 있습니다.

동영상 모델에 등급 속성 추가

  1. Models/Movie.cs 파일을 열고 속성을 추가합니다.Rating

    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Pages/Movies/Index.cshtml을 편집하고 Rating 필드를 추가합니다.

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            <label>Title: <input type="text" asp-for="SearchString" /></label>
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Rating 필드를 사용하여 다음 페이지를 업데이트합니다.

새 필드를 포함하도록 데이터베이스가 업데이트될 때까지 앱은 작동하지 않습니다. 데이터베이스를 업데이트하지 않고 앱을 실행하면 SqlException이 throw됩니다.

SqlException: Invalid column name 'Rating'.

SqlException 예외는 업데이트된 영화 모델 클래스가 데이터베이스의 영화 테이블의 스키마와 다르면 발생합니다. 데이터베이스 테이블에 Rating 열이 없습니다.

이 오류를 해결할 수 있는 몇 가지 방법이 있습니다.

  1. 새 모델 클래스 스키마를 사용하여 Entity Framework를 자동으로 삭제하고 데이터베이스를 다시 만듭니다. 이 방법은 개발 주기의 초기 단계에서 편리하며, 개발자는 신속하게 모델 및 데이터베이스 스키마를 함께 개발할 수 있습니다. 단점은 데이터베이스의 기존 데이터를 잃게 된다는 것입니다. 프로덕션 데이터베이스에서 이 방법을 사용하지 마세요. 테스트 데이터로 데이터베이스를 자동으로 시드하도록 스키마 변경 시 데이터베이스를 삭제하고 이니셜라이저를 사용하는 것은 종종 앱을 개발하는 효율적인 방법입니다.
  2. 모델 클래스와 일치하도록 기존 데이터베이스의 스키마를 명시적으로 수정합니다. 이 방법의 장점은 데이터가 유지된다는 점입니다. 이러한 변경을 수동으로 수행하거나 데이터베이스 변경 스크립트를 만들어 수행합니다.
  3. Code First 마이그레이션을 사용하여 데이터베이스 스키마를 업데이트합니다.

이 자습서의 경우 Code First 마이그레이션을 사용합니다.

새 열에 대한 값을 제공하도록 SeedData 클래스를 수정합니다. 아래에 샘플 변경이 나와 있지만 new Movie 블록마다 이 변경을 수행하세요.

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

완료된 SeedData.cs 파일을 참조하세요.

앱 빌드

Ctrl Shift B를+누릅니다.+

등급 필드에 대한 마이그레이션을 추가합니다.

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

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

    Add-Migration Rating
    Update-Database
    

Add-Migration 명령은 프레임워크에 다음 작업을 지시합니다.

  • Movie 모델을 Movie 데이터베이스 스키마와 비교합니다.
  • 데이터베이스 스키마를 새 모델로 마이그레이션하도록 코드를 작성합니다.

"Rating" 이름은 임의로 지정되며 마이그레이션 파일의 이름을 지정하는 데 사용됩니다. 마이그레이션 파일에 의미 있는 이름을 사용하는 것이 좋습니다.

Update-Database 명령은 프레임워크에게 스키마 변경 내용을 데이터베이스에 적용하고 기존 데이터를 보존하라고 명령합니다.

데이터베이스의 모든 레코드를 삭제하면 이니셜라이저가 데이터베이스를 시드하고 Rating 필드를 포함합니다. 브라우저 또는 SSOX(SQL Server 개체 탐색기)에서 삭제 링크를 사용하여 삭제를 수행할 수 있습니다.

다른 옵션은 데이터베이스를 삭제하고 마이그레이션을 사용하여 데이터베이스를 다시 만드는 것입니다. SSOX에서 데이터베이스를 삭제하려면:

  1. SSOX에서 데이터베이스를 선택합니다.

  2. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  3. 기존 연결 닫기를 선택합니다.

  4. 확인을 선택합니다.

  5. PMC에서 데이터베이스를 업데이트합니다.

    Update-Database
    

앱을 실행하고 Rating 필드를 사용하여 영화를 생성, 편집, 표시할 수 있는지 확인합니다. 데이터베이스가 시드되지 않은 경우 SeedData.Initialize 메서드에서 중단점을 설정합니다.

다음 단계

이 섹션에서는 Entity Framework Code First 마이그레이션으로 다음 작업을 수행합니다.

  • 모델에 새 필드를 추가합니다.
  • 데이터베이스로 새 필드 스키마 변경 내용을 마이그레이션합니다.

EF Code First를 사용하여 자동으로 데이터베이스를 만들고 추적할 경우 Code First는:

  • 데이터베이스에 __EFMigrationsHistory 테이블을 추가하여 데이터베이스의 스키마가 생성된 모델 클래스와 동기화되어 있는지 여부를 추적합니다.
  • 모델 클래스가 데이터베이스와 동기화되지 않으면 예외를 throw합니다.

스키마와 모델의 동기화를 자동 확인하면 일관성이 없는 데이터베이스 코드 문제를 쉽게 찾을 수 있습니다.

동영상 모델에 등급 속성 추가

  1. Models/Movie.cs 파일을 열고 속성을 추가합니다.Rating

    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Pages/Movies/Index.cshtml을 편집하고 Rating 필드를 추가합니다.

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            <label>Title: <input type="text" asp-for="SearchString" /></label>
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Rating 필드를 사용하여 다음 페이지를 업데이트합니다.

새 필드를 포함하도록 데이터베이스가 업데이트될 때까지 앱은 작동하지 않습니다. 데이터베이스를 업데이트하지 않고 앱을 실행하면 SqlException이 throw됩니다.

SqlException: Invalid column name 'Rating'.

SqlException 예외는 업데이트된 영화 모델 클래스가 데이터베이스의 영화 테이블의 스키마와 다르면 발생합니다. 데이터베이스 테이블에 Rating 열이 없습니다.

이 오류를 해결할 수 있는 몇 가지 방법이 있습니다.

  1. 새 모델 클래스 스키마를 사용하여 Entity Framework를 자동으로 삭제하고 데이터베이스를 다시 만듭니다. 이 방법은 개발 주기의 초기 단계에서 편리하며, 개발자는 신속하게 모델 및 데이터베이스 스키마를 함께 개발할 수 있습니다. 단점은 데이터베이스의 기존 데이터를 잃게 된다는 것입니다. 프로덕션 데이터베이스에서 이 방법을 사용하지 마세요. 테스트 데이터로 데이터베이스를 자동으로 시드하도록 스키마 변경 시 데이터베이스를 삭제하고 이니셜라이저를 사용하는 것은 종종 앱을 개발하는 효율적인 방법입니다.
  2. 모델 클래스와 일치하도록 기존 데이터베이스의 스키마를 명시적으로 수정합니다. 이 방법의 장점은 데이터가 유지된다는 점입니다. 이러한 변경을 수동으로 수행하거나 데이터베이스 변경 스크립트를 만들어 수행합니다.
  3. Code First 마이그레이션을 사용하여 데이터베이스 스키마를 업데이트합니다.

이 자습서의 경우 Code First 마이그레이션을 사용합니다.

새 열에 대한 값을 제공하도록 SeedData 클래스를 수정합니다. 아래에 샘플 변경이 나와 있지만 new Movie 블록마다 이 변경을 수행하세요.

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

완료된 SeedData.cs 파일을 참조하세요.

앱 빌드

Ctrl Shift B를+누릅니다.+

등급 필드에 대한 마이그레이션을 추가합니다.

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

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

    Add-Migration Rating
    Update-Database
    

Add-Migration 명령은 프레임워크에 다음 작업을 지시합니다.

  • Movie 모델을 Movie 데이터베이스 스키마와 비교합니다.
  • 데이터베이스 스키마를 새 모델로 마이그레이션하도록 코드를 작성합니다.

"Rating" 이름은 임의로 지정되며 마이그레이션 파일의 이름을 지정하는 데 사용됩니다. 마이그레이션 파일에 의미 있는 이름을 사용하는 것이 좋습니다.

Update-Database 명령은 프레임워크에게 스키마 변경 내용을 데이터베이스에 적용하고 기존 데이터를 보존하라고 명령합니다.

데이터베이스의 모든 레코드를 삭제하면 이니셜라이저가 데이터베이스를 시드하고 Rating 필드를 포함합니다. 브라우저 또는 SSOX(SQL Server 개체 탐색기)에서 삭제 링크를 사용하여 삭제를 수행할 수 있습니다.

다른 옵션은 데이터베이스를 삭제하고 마이그레이션을 사용하여 데이터베이스를 다시 만드는 것입니다. SSOX에서 데이터베이스를 삭제하려면:

  1. SSOX에서 데이터베이스를 선택합니다.

  2. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  3. 기존 연결 닫기를 선택합니다.

  4. 확인을 선택합니다.

  5. PMC에서 데이터베이스를 업데이트합니다.

    Update-Database
    

앱을 실행하고 Rating 필드를 사용하여 영화를 생성, 편집, 표시할 수 있는지 확인합니다. 데이터베이스가 시드되지 않은 경우 SeedData.Initialize 메서드에서 중단점을 설정합니다.

다음 단계

이 섹션에서는 Entity Framework Code First 마이그레이션으로 다음 작업을 수행합니다.

  • 모델에 새 필드를 추가합니다.
  • 데이터베이스로 새 필드 스키마 변경 내용을 마이그레이션합니다.

EF Code First를 사용하여 자동으로 데이터베이스를 만들고 추적할 경우 Code First는:

  • 데이터베이스에 __EFMigrationsHistory 테이블을 추가하여 데이터베이스의 스키마가 생성된 모델 클래스와 동기화되어 있는지 여부를 추적합니다.
  • 모델 클래스가 데이터베이스와 동기화되지 않으면 예외를 throw합니다.

스키마와 모델의 동기화를 자동 확인하면 일관성이 없는 데이터베이스 코드 문제를 쉽게 찾을 수 있습니다.

동영상 모델에 등급 속성 추가

  1. Models/Movie.cs 파일을 열고 속성을 추가합니다.Rating

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Pages/Movies/Index.cshtml을 편집하고 Rating 필드를 추가합니다.

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            <label>Title: <input type="text" asp-for="SearchString" /></label>
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Rating 필드를 사용하여 다음 페이지를 업데이트합니다.

새 필드를 포함하도록 데이터베이스가 업데이트될 때까지 앱은 작동하지 않습니다. 데이터베이스를 업데이트하지 않고 앱을 실행하면 SqlException이 throw됩니다.

SqlException: Invalid column name 'Rating'.

SqlException 예외는 업데이트된 영화 모델 클래스가 데이터베이스의 영화 테이블의 스키마와 다르면 발생합니다. 데이터베이스 테이블에 Rating 열이 없습니다.

이 오류를 해결할 수 있는 몇 가지 방법이 있습니다.

  1. 새 모델 클래스 스키마를 사용하여 Entity Framework를 자동으로 삭제하고 데이터베이스를 다시 만듭니다. 이 방법은 개발 주기의 초기 단계에서 편리하며, 개발자는 신속하게 모델 및 데이터베이스 스키마를 함께 개발할 수 있습니다. 단점은 데이터베이스의 기존 데이터를 잃게 된다는 것입니다. 프로덕션 데이터베이스에서 이 방법을 사용하지 마세요. 테스트 데이터로 데이터베이스를 자동으로 시드하도록 스키마 변경 시 데이터베이스를 삭제하고 이니셜라이저를 사용하는 것은 종종 앱을 개발하는 효율적인 방법입니다.
  2. 모델 클래스와 일치하도록 기존 데이터베이스의 스키마를 명시적으로 수정합니다. 이 방법의 장점은 데이터가 유지된다는 점입니다. 이러한 변경을 수동으로 수행하거나 데이터베이스 변경 스크립트를 만들어 수행합니다.
  3. Code First 마이그레이션을 사용하여 데이터베이스 스키마를 업데이트합니다.

이 자습서의 경우 Code First 마이그레이션을 사용합니다.

새 열에 대한 값을 제공하도록 SeedData 클래스를 수정합니다. 아래에 샘플 변경이 나와 있지만 new Movie 블록마다 이 변경을 수행하세요.

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

완료된 SeedData.cs 파일을 참조하세요.

솔루션을 빌드합니다.

등급 필드에 대한 마이그레이션을 추가합니다.

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

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

    Add-Migration Rating
    Update-Database
    

Add-Migration 명령은 프레임워크에 다음 작업을 지시합니다.

  • Movie 모델을 Movie 데이터베이스 스키마와 비교합니다.
  • 데이터베이스 스키마를 새 모델로 마이그레이션하도록 코드를 작성합니다.

"Rating" 이름은 임의로 지정되며 마이그레이션 파일의 이름을 지정하는 데 사용됩니다. 마이그레이션 파일에 의미 있는 이름을 사용하는 것이 좋습니다.

Update-Database 명령은 프레임워크에게 스키마 변경 내용을 데이터베이스에 적용하고 기존 데이터를 보존하라고 명령합니다.

데이터베이스의 모든 레코드를 삭제하면 이니셜라이저가 데이터베이스를 시드하고 Rating 필드를 포함합니다. 브라우저 또는 SSOX(SQL Server 개체 탐색기)에서 삭제 링크를 사용하여 삭제를 수행할 수 있습니다.

다른 옵션은 데이터베이스를 삭제하고 마이그레이션을 사용하여 데이터베이스를 다시 만드는 것입니다. SSOX에서 데이터베이스를 삭제하려면:

  1. SSOX에서 데이터베이스를 선택합니다.

  2. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  3. 기존 연결 닫기를 선택합니다.

  4. 확인을 선택합니다.

  5. PMC에서 데이터베이스를 업데이트합니다.

    Update-Database
    

앱을 실행하고 Rating 필드를 사용하여 영화를 생성, 편집, 표시할 수 있는지 확인합니다. 데이터베이스가 시드되지 않은 경우 SeedData.Initialize 메서드에서 중단점을 설정합니다.

다음 단계

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

이 섹션에서는 Entity Framework Code First 마이그레이션으로 다음 작업을 수행합니다.

  • 모델에 새 필드를 추가합니다.
  • 데이터베이스로 새 필드 스키마 변경 내용을 마이그레이션합니다.

EF Code First를 사용하여 자동으로 데이터베이스를 만들 경우 Code First는

  • 데이터베이스에 __EFMigrationsHistory 테이블을 추가하여 데이터베이스의 스키마가 생성된 모델 클래스와 동기화되어 있는지 여부를 추적합니다.
  • 모델 클래스가 데이터베이스와 동기화되지 않으면 EF는 예외를 throw합니다.

스키마와 모델의 동기화를 자동 확인하면 일관성이 없는 데이터베이스 코드 문제를 쉽게 찾을 수 있습니다.

동영상 모델에 등급 속성 추가

  1. Models/Movie.cs 파일을 열고 속성을 추가합니다.Rating

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; }
    }
    
  2. 앱을 빌드합니다.

  3. Pages/Movies/Index.cshtml을 편집하고 Rating 필드를 추가합니다.

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            <label>Title: <input type="text" asp-for="SearchString" /></label>
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  4. Rating 필드를 사용하여 다음 페이지를 업데이트합니다.

새 필드를 포함하도록 데이터베이스가 업데이트될 때까지 앱은 작동하지 않습니다. 데이터베이스를 업데이트하지 않고 앱을 실행하면 SqlException이 throw됩니다.

SqlException: Invalid column name 'Rating'.

SqlException 예외는 업데이트된 영화 모델 클래스가 데이터베이스의 영화 테이블의 스키마와 다르면 발생합니다. 데이터베이스 테이블에 Rating 열이 없습니다.

이 오류를 해결할 수 있는 몇 가지 방법이 있습니다.

  1. 새 모델 클래스 스키마를 사용하여 Entity Framework를 자동으로 삭제하고 데이터베이스를 다시 만듭니다. 이 방법은 개발 주기의 초기 단계에서 편리하며 신속하게 모델 및 데이터베이스 스키마를 함께 개발할 수 있습니다. 단점은 데이터베이스의 기존 데이터를 잃게 된다는 것입니다. 프로덕션 데이터베이스에서 이 방법을 사용하지 마세요. 테스트 데이터로 데이터베이스를 자동으로 시드하도록 스키마 변경 시 데이터베이스를 삭제하고 이니셜라이저를 사용하는 것은 종종 앱을 개발하는 효율적인 방법입니다.

  2. 모델 클래스와 일치하도록 기존 데이터베이스의 스키마를 명시적으로 수정합니다. 이 방법의 장점은 데이터가 유지된다는 점입니다. 이러한 변경을 수동으로 수행하거나 데이터베이스 변경 스크립트를 만들어 수행합니다.

  3. Code First 마이그레이션을 사용하여 데이터베이스 스키마를 업데이트합니다.

이 자습서의 경우 Code First 마이그레이션을 사용합니다.

새 열에 대한 값을 제공하도록 SeedData 클래스를 수정합니다. 아래에 샘플 변경이 나와 있지만 new Movie 블록마다 이 변경을 수행하세요.

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

완료된 SeedData.cs 파일을 참조하세요.

솔루션을 빌드합니다.

등급 필드에 대한 마이그레이션을 추가합니다.

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

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

    Add-Migration Rating
    Update-Database
    

Add-Migration 명령은 프레임워크에 다음 작업을 지시합니다.

  • Movie 모델을 Movie 데이터베이스 스키마와 비교합니다.
  • 데이터베이스 스키마를 새 모델로 마이그레이션하도록 코드를 작성합니다.

"Rating" 이름은 임의로 지정되며 마이그레이션 파일의 이름을 지정하는 데 사용됩니다. 마이그레이션 파일에 의미 있는 이름을 사용하는 것이 좋습니다.

Update-Database 명령은 프레임워크에게 스키마 변경 내용을 데이터베이스에 적용하고 기존 데이터를 보존하라고 명령합니다.

데이터베이스의 모든 레코드를 삭제하면 이니셜라이저가 데이터베이스를 시드하고 Rating 필드를 포함합니다. 브라우저 또는 SSOX(SQL Server 개체 탐색기)에서 삭제 링크를 사용하여 삭제를 수행할 수 있습니다.

다른 옵션은 데이터베이스를 삭제하고 마이그레이션을 사용하여 데이터베이스를 다시 만드는 것입니다. SSOX에서 데이터베이스를 삭제하려면:

  1. SSOX에서 데이터베이스를 선택합니다.

  2. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  3. 기존 연결 닫기를 선택합니다.

  4. 확인을 선택합니다.

  5. PMC에서 데이터베이스를 업데이트합니다.

    Update-Database
    

앱을 실행하고 Rating 필드를 사용하여 영화를 만들고/편집/표시할 수 있는지 확인합니다. 데이터베이스가 시드되지 않은 경우 SeedData.Initialize 메서드에서 중단점을 설정합니다.

다음 단계

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

이 섹션에서는 Entity Framework Code First 마이그레이션으로 다음 작업을 수행합니다.

  • 모델에 새 필드를 추가합니다.
  • 데이터베이스로 새 필드 스키마 변경 내용을 마이그레이션합니다.

EF Code First를 사용하여 자동으로 데이터베이스를 만들 경우 Code First는

  • 데이터베이스에 __EFMigrationsHistory 테이블을 추가하여 데이터베이스의 스키마가 생성된 모델 클래스와 동기화되어 있는지 여부를 추적합니다.
  • 모델 클래스가 데이터베이스와 동기화되지 않으면 EF는 예외를 throw합니다.

스키마와 모델의 동기화를 자동 확인하면 일관성이 없는 데이터베이스 코드 문제를 쉽게 찾을 수 있습니다.

동영상 모델에 등급 속성 추가

  1. Models/Movie.cs 파일을 열고 속성을 추가합니다.Rating

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; }
    }
    
  2. 앱을 빌드합니다.

  3. Pages/Movies/Index.cshtml을 편집하고 Rating 필드를 추가합니다.

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            <label>Title: <input type="text" asp-for="SearchString" /></label>
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  4. Rating 필드를 사용하여 다음 페이지를 업데이트합니다.

새 필드를 포함하도록 데이터베이스가 업데이트될 때까지 앱은 작동하지 않습니다. 데이터베이스를 업데이트하지 않고 앱을 실행하면 SqlException이 throw됩니다.

SqlException: Invalid column name 'Rating'.

SqlException 예외는 업데이트된 영화 모델 클래스가 데이터베이스의 영화 테이블의 스키마와 다르면 발생합니다. 데이터베이스 테이블에 Rating 열이 없습니다.

이 오류를 해결할 수 있는 몇 가지 방법이 있습니다.

  1. 새 모델 클래스 스키마를 사용하여 Entity Framework를 자동으로 삭제하고 데이터베이스를 다시 만듭니다. 이 방법은 개발 주기의 초기 단계에서 편리하며 신속하게 모델 및 데이터베이스 스키마를 함께 개발할 수 있습니다. 단점은 데이터베이스의 기존 데이터를 잃게 된다는 것입니다. 프로덕션 데이터베이스에서 이 방법을 사용하지 마세요. 테스트 데이터로 데이터베이스를 자동으로 시드하도록 스키마 변경 시 데이터베이스를 삭제하고 이니셜라이저를 사용하는 것은 종종 앱을 개발하는 효율적인 방법입니다.

  2. 모델 클래스와 일치하도록 기존 데이터베이스의 스키마를 명시적으로 수정합니다. 이 방법의 장점은 데이터가 유지된다는 점입니다. 이러한 변경을 수동으로 수행하거나 데이터베이스 변경 스크립트를 만들어 수행합니다.

  3. Code First 마이그레이션을 사용하여 데이터베이스 스키마를 업데이트합니다.

이 자습서의 경우 Code First 마이그레이션을 사용합니다.

새 열에 대한 값을 제공하도록 SeedData 클래스를 수정합니다. 아래에 샘플 변경이 나와 있지만 new Movie 블록마다 이 변경을 수행하세요.

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

완료된 SeedData.cs 파일을 참조하세요.

솔루션을 빌드합니다.

등급 필드에 대한 마이그레이션을 추가합니다.

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

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

    Add-Migration Rating
    Update-Database
    

Add-Migration 명령은 프레임워크에 다음 작업을 지시합니다.

  • Movie 모델을 Movie 데이터베이스 스키마와 비교합니다.
  • 데이터베이스 스키마를 새 모델로 마이그레이션하도록 코드를 작성합니다.

"Rating" 이름은 임의로 지정되며 마이그레이션 파일의 이름을 지정하는 데 사용됩니다. 마이그레이션 파일에 의미 있는 이름을 사용하는 것이 좋습니다.

Update-Database 명령은 프레임워크에게 스키마 변경 내용을 데이터베이스에 적용하고 기존 데이터를 보존하라고 명령합니다.

데이터베이스의 모든 레코드를 삭제하면 이니셜라이저가 데이터베이스를 시드하고 Rating 필드를 포함합니다. 브라우저 또는 SSOX(Sql Server 개체 탐색기)에서 삭제 링크를 사용하여 이를 수행할 수 있습니다.

다른 옵션은 데이터베이스를 삭제하고 마이그레이션을 사용하여 데이터베이스를 다시 만드는 것입니다. SSOX에서 데이터베이스를 삭제하려면:

  • SSOX에서 데이터베이스를 선택합니다.

  • 데이터베이스를 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  • 기존 연결 닫기를 선택합니다.

  • 확인을 선택합니다.

  • PMC에서 데이터베이스를 업데이트합니다.

    Update-Database
    

앱을 실행하고 Rating 필드를 사용하여 영화를 만들고/편집/표시할 수 있는지 확인합니다. 데이터베이스가 시드되지 않은 경우 SeedData.Initialize 메서드에서 중단점을 설정합니다.

다음 단계