영화 모델 및 테이블에 새 필드 추가

작성자: Rick Anderson

참고

이 자습서의 업데이트된 버전은 ASP.NET MVC 5 및 Visual Studio 2013 사용하는 여기에서 사용할 수 있습니다. 더 안전하고 따라하기가 훨씬 더 간단하며 더 많은 기능을 보여 줍니다.

이 섹션에서는 Entity Framework Code First 마이그레이션 사용하여 변경 내용이 데이터베이스에 적용되도록 모델 클래스에 대한 일부 변경 내용을 마이그레이션합니다.

이 자습서의 앞부분에서와 같이 Entity Framework Code First를 사용하여 데이터베이스를 자동으로 만드는 경우 Code First는 데이터베이스의 스키마가 생성된 모델 클래스와 동기화되어 있는지 여부를 추적하는 데 도움이 되는 테이블을 데이터베이스에 추가합니다. 동기화되지 않으면 Entity Framework에서 오류가 발생합니다. 이렇게 하면 개발 시 런타임에 (모호한 오류로) 찾을 수 있는 문제를 더 쉽게 추적할 수 있습니다.

모델 변경에 대한 Code First 마이그레이션 설정

Visual Studio 2012를 사용하는 경우 솔루션 탐색기 Movies.mdf 파일을 두 번 클릭하여 데이터베이스 도구를 엽니다. 웹용 Visual Studio Express 데이터베이스 Explorer 표시되며 Visual Studio 2012에는 서버 Explorer 표시됩니다. Visual Studio 2010을 사용하는 경우 SQL Server 개체 탐색기 사용합니다.

데이터베이스 도구(데이터베이스 Explorer, 서버 Explorer 또는 SQL Server 개체 탐색기)에서 마우스 오른쪽 단추를 클릭하고 MovieDBContext삭제를 선택하여 영화 데이터베이스를 삭제합니다.

서버 Explorer 창을 보여 주는 스크린샷 삭제는 영화 D B 컨텍스트 오른쪽 클릭 메뉴에서 선택됩니다.

솔루션 탐색기 다시 이동합니다. Movies.mdf 파일을 마우스 오른쪽 단추로 클릭하고 삭제를 선택하여 movies 데이터베이스를 제거합니다.

솔루션 탐색기 창을 보여 주는 스크린샷 영화 점 m d f 마우스 오른쪽 단추 클릭 메뉴에서 삭제가 선택됩니다.

애플리케이션을 빌드하여 오류가 없는지 확인합니다.

도구 메뉴에서 NuGet 패키지 관리자를 클릭한 다음 패키지 관리자 콘솔을 클릭합니다.

팩 맨 추가

프롬프트의 패키지 관리자 콘솔 창에서 PM> "Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext"를 입력합니다.

패키지 관리자 콘솔 창을 보여 주는 스크린샷 마이그레이션 사용 명령이 입력됩니다.

Enable-Migrations 명령(위 그림 참조)은 새 Migrations 폴더에 Configuration.cs 파일을 만듭니다.

솔루션 탐색기 창을 보여 주는 스크린샷 Migrations 폴더와 Configuration dot c의 파일은 빨간색으로 동그라미를 찍습니다.

Visual Studio에서 Configuration.cs 파일을 엽니다. SeedConfiguration.cs 파일의 메서드를 다음 코드로 바꿉니다.

protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
    context.Movies.AddOrUpdate( i => i.Title,
        new Movie
        {
            Title = "When Harry Met Sally",
            ReleaseDate = DateTime.Parse("1989-1-11"),
            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
       }
   );
   
}

아래의 빨간색 물결선을 마우스 오른쪽 단추 Movie 로 클릭하고 해결을 선택한 다음 MvcMovie.Models를 사용하세요.

동영상 마우스 오른쪽 단추 클릭 메뉴에서 선택한 해결을 보여 주는 스크린샷

이렇게 하면 다음 using 문이 추가되었습니다.

using MvcMovie.Models;

참고

Code First 마이그레이션 모든 마이그레이션 후에 메서드를 호출 Seed 합니다(즉, 패키지 관리자 콘솔에서 update-database 호출). 이 메서드는 이미 삽입된 행을 업데이트하거나 아직 없는 경우 삽입합니다.

Ctrl-Shift-B를 눌러 프로젝트를 빌드합니다.(이 시점에서 빌드하지 않으면 다음 단계가 실패합니다.)

다음 단계는 초기 마이그레이션을 DbMigration 위한 클래스를 만드는 것입니다. 이 마이그레이션을 통해 새 데이터베이스를 만들 수 있으므로 이전 단계에서 movie.mdf 파일을 삭제했습니다.

패키지 관리자 콘솔 창에서 "추가 마이그레이션 초기" 명령을 입력하여 초기 마이그레이션을 만듭니다. 이름 "Initial"은 임의이며 생성된 마이그레이션 파일의 이름을 지정하는 데 사용됩니다.

패키지 관리자 콘솔 창을 보여 주는 스크린샷 이 마이그레이션 파일에 대한 Designer 코드로 시작하는 단락이 강조 표시됩니다.

Code First 마이그레이션 이름이 {DateStamp}_Initial.csMigrations 폴더에 다른 클래스 파일을 만들고 이 클래스에는 데이터베이스 스키마를 만드는 코드가 포함되어 있습니다. 마이그레이션 파일 이름은 순서 지정에 도움이 되도록 타임스탬프로 미리 고정됩니다. {DateStamp}_Initial.cs 파일을 검사합니다. 여기에는 Movie DB에 대한 Movies 테이블을 만드는 지침이 포함되어 있습니다. 아래 지침에서 데이터베이스를 업데이트하면 이 {DateStamp}_Initial.cs 파일이 실행되어 DB 스키마를 만듭니다. 그런 다음 Seed 메서드가 실행되어 DB를 테스트 데이터로 채웁습니다.

패키지 관리자 콘솔에서 "update-database" 명령을 입력하여 데이터베이스를 만들고 Seed 메서드를 실행합니다.

패키지 관리자 콘솔 창을 보여 주는 스크린샷 데이터베이스 업데이트 명령이 입력됩니다.

테이블이 이미 있고 만들 수 없음을 나타내는 오류가 발생하면 데이터베이스를 삭제한 후 를 실행하기 전에 애플리케이션을 실행했기 update-database때문일 수 있습니다. 이 경우 Movies.mdf 파일을 다시 삭제하고 명령을 다시 시도합니다 update-database . 여전히 오류가 발생하는 경우 마이그레이션 폴더 및 내용을 삭제한 다음 이 페이지 맨 위에 있는 지침( Movies.mdf 파일을 삭제한 다음 Enable-Migrations로 진행)으로 시작합니다.

애플리케이션을 실행하고 /Movies URL로 이동합니다. 시드 데이터가 표시됩니다.

4개의 영화 목록이 있는 M V C 무비 인덱스 페이지를 보여 주는 스크린샷.

영화 모델에 등급 속성 추가

먼저 기존 Movie 클래스에 새 Rating 속성을 추가합니다. Models\Movie.cs 파일을 열고 다음과 같은 속성을 추가 Rating 합니다.

public string Rating { get; set; }

이제 전체 Movie 클래스는 다음 코드와 같습니다.

public class Movie
{
    public int ID { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }
    public string Rating { get; set; }
}

빌드 영화 빌드 메뉴 명령을 사용하거나 Ctrl-Shift-B를 눌러 애플리케이션을 빌드>합니다.

이제 클래스를 Model 업데이트했으므로 브라우저 보기에 새 Rating 속성을 표시하려면 \Views\Movies\Index.cshtml\Views\Movies\Create.cshtml 보기 템플릿도 업데이트해야 합니다.

\Views\Movies\Index.cshtml 파일을 열고 Price 열 바로 다음에 열 제목을 추가 <th>Rating</th> 합니다. 그런 다음 템플릿의 끝 부분에 열을 추가하여 <td> 값을 렌더링합니다 @item.Rating . 다음은 업데이트된 Index.cshtml 보기 템플릿의 모양입니다.

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Price)
        </th>
         <th>
            @Html.DisplayNameFor(model => model.Rating)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <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>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

다음으로 \Views\Movies\Create.cshtml 파일을 열고 양식의 끝 부분에 다음 태그를 추가합니다. 이렇게 하면 새 동영상을 만들 때 등급을 지정할 수 있도록 텍스트 상자가 렌더링됩니다.

<div class="editor-label">
    @Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Rating)
    @Html.ValidationMessageFor(model => model.Rating)
</div>

이제 새 Rating 속성을 지원하도록 애플리케이션 코드를 업데이트했습니다.

이제 애플리케이션을 실행하고 /Movies URL로 이동합니다. 하지만 이렇게 하면 다음 오류 중 하나가 표시됩니다.

잘못된 작업 예외가 사용자 코드에 의해 처리되지 않은 오류를 보여 주는 스크린샷

애플리케이션의 서버 오류를 나타내는 오류가 있는 브라우저 창을 보여 주는 스크린샷

이제 애플리케이션의 업데이트 Movie 된 모델 클래스가 기존 데이터베이스 테이블의 Movie 스키마와 다르기 때문에 이 오류가 표시됩니다. (데이터베이스 테이블에 Rating 열이 없습니다.)

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

  1. Entity Framework에서 새 모델 클래스 스키마에 따라 데이터베이스를 자동으로 삭제하고 다시 만들도록 합니다. 이 방법은 테스트 데이터베이스에서 활성 개발을 수행할 때 매우 편리합니다. 이를 통해 모델과 데이터베이스 스키마를 빠르게 발전할 수 있습니다. 하지만 단점은 데이터베이스의 기존 데이터가 손실되므로 프로덕션 데이터베이스에서 이 방법을 사용하지 않으려는 것입니다. 이니셜라이저를 사용하여 테스트 데이터를 사용하여 데이터베이스를 자동으로 시드하는 것은 종종 애플리케이션을 개발하는 생산적인 방법입니다. Entity Framework 데이터베이스 이니셜라이저에 대한 자세한 내용은 Tom Dykstra의 ASP.NET MVC/Entity Framework 자습서를 참조하세요.
  2. 모델 클래스와 일치하도록 기존 데이터베이스의 스키마를 명시적으로 수정합니다. 이 방법의 장점은 데이터가 유지된다는 점입니다. 이러한 변경을 수동으로 수행하거나 데이터베이스 변경 스크립트를 만들어 수행할 수 있습니다.
  3. Code First 마이그레이션을 사용하여 데이터베이스 스키마를 업데이트합니다.

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

새 열에 대한 값을 제공하려면 Seed 메서드를 업데이트합니다. Migrations\Configuration.cs 파일을 열고 각 Movie 개체에 등급 필드를 추가합니다.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "G",
    Price = 7.99M
},

솔루션을 빌드한 다음 패키지 관리자 콘솔 창을 열고 다음 명령을 입력합니다.

add-migration AddRatingMig

명령은 add-migration 마이그레이션 프레임워크에 현재 영화 DB 스키마를 사용하여 현재 동영상 모델을 검사하고 DB를 새 모델로 마이그레이션하는 데 필요한 코드를 만들도록 지시합니다. AddRatingMig는 임의이며 마이그레이션 파일의 이름을 지정하는 데 사용됩니다. 마이그레이션 단계에 의미 있는 이름을 사용하는 것이 유용합니다.

이 명령이 완료되면 Visual Studio는 새 파생 클래스를 정의하는 클래스 파일을 열고 메서드에서 UpDbMigration 열을 만드는 코드를 볼 수 있습니다.

public partial class AddRatingMig : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Movies", "Rating", c => c.String());
    }
    
    public override void Down()
    {
        DropColumn("dbo.Movies", "Rating");
    }
}

솔루션을 빌드한 다음 패키지 관리자 콘솔 창에서 "update-database" 명령을 입력합니다.

다음 이미지는 패키지 관리자 콘솔 창의 출력을 보여 줍니다(AddRatingMig 앞에 추가된 날짜 스탬프는 다릅니다.)

데이터베이스 업데이트 명령을 보여 주는 스크린샷

애플리케이션을 다시 실행하고 /Movies URL로 이동합니다. 새 등급 필드를 볼 수 있습니다.

4개의 영화가 나열된 M V C 무비 인덱스 페이지를 보여 주는 스크린샷

새로 만들기 링크를 클릭하여 새 동영상을 추가합니다. 등급을 추가할 수 있습니다.

7_CreateRioII

만들기를 클릭합니다. 등급을 포함한 새 영화가 이제 영화 목록에 표시됩니다.

7_ourNewMovie_SM

또한 편집, 세부 정보 및 SearchIndex 보기 템플릿에 필드를 추가 Rating 해야 합니다.

패키지 관리자 콘솔 창에서 "update-database" 명령을 다시 입력할 수 있으며 스키마가 모델과 일치하므로 변경되지 않습니다.

이 섹션에서는 모델 개체를 수정하고 데이터베이스를 변경 내용과 동기화된 상태로 유지하는 방법을 알아보았습니다. 시나리오를 사용해 볼 수 있도록 새로 만든 데이터베이스를 샘플 데이터로 채우는 방법도 알아보았습니다. 다음으로 모델 클래스에 보다 풍부한 유효성 검사 논리를 추가하고 일부 비즈니스 규칙을 적용할 수 있는 방법을 살펴보겠습니다.