다음을 통해 공유


Entity Framework를 사용하여 모델 클래스 만들기(C#)

작성자: Microsoft

이 자습서에서는 Microsoft Entity Framework에서 ASP.NET MVC를 사용하는 방법을 알아봅니다. 엔터티 마법사를 사용하여 ADO.NET 엔터티 데이터 모델을 만드는 방법을 알아봅니다. 이 자습서를 진행하는 동안 Entity Framework를 사용하여 데이터베이스 데이터를 선택, 삽입, 업데이트 및 삭제하는 방법을 보여 주는 웹 애플리케이션을 빌드합니다.

이 자습서의 목표는 ASP.NET MVC 애플리케이션을 빌드할 때 Microsoft Entity Framework를 사용하여 데이터 액세스 클래스를 만드는 방법을 설명하는 것입니다. 이 자습서에서는 Microsoft Entity Framework에 대한 이전 지식이 없다고 가정합니다. 이 자습서를 마치면 Entity Framework를 사용하여 데이터베이스 레코드를 선택, 삽입, 업데이트 및 삭제하는 방법을 이해할 수 있습니다.

Microsoft Entity Framework는 데이터베이스에서 데이터 액세스 계층을 자동으로 생성할 수 있는 O/RM(개체 관계형 매핑) 도구입니다. Entity Framework를 사용하면 데이터 액세스 클래스를 직접 빌드하는 지루한 작업을 방지할 수 있습니다.

ASP.NET MVC에서 Microsoft Entity Framework를 사용하는 방법을 설명하기 위해 간단한 샘플 애플리케이션을 빌드합니다. 동영상 데이터베이스 레코드를 표시하고 편집할 수 있는 무비 데이터베이스 애플리케이션을 만듭니다.

이 자습서에서는 Visual Studio 2008 또는 Visual Web Developer 2008 서비스 팩 1이 있다고 가정합니다. Entity Framework를 사용하려면 서비스 팩 1이 필요합니다. 다음 주소에서 Visual Studio 2008 서비스 팩 1 또는 Visual Web Developer with Service Pack 1을 다운로드할 수 있습니다.

https://www.asp.net/downloads/

참고

ASP.NET MVC와 Microsoft Entity Framework 간에는 필수 연결이 없습니다. ASP.NET MVC와 함께 사용할 수 있는 Entity Framework에 대한 몇 가지 대안이 있습니다. 예를 들어 Microsoft LINQ to SQL, NHibernate 또는 SubSonic과 같은 다른 O/RM 도구를 사용하여 MVC 모델 클래스를 빌드할 수 있습니다.

동영상 샘플 데이터베이스 만들기

Movie Database 애플리케이션은 다음 열이 포함된 Movies라는 데이터베이스 테이블을 사용합니다.

열 이름 데이터 형식 Null을 허용합니까? 기본 키인가요?
Id int False True
제목 nvarchar(100) False 거짓
감독 nvarchar(100) False 거짓

다음 단계를 수행하여 ASP.NET MVC 프로젝트에 이 테이블을 추가할 수 있습니다.

  1. 솔루션 탐색기 창에서 App_Data 폴더를 마우스 오른쪽 단추로 클릭하고 메뉴 옵션 추가, 새 항목을 선택합니다.
  2. 새 항목 추가 대화 상자에서 SQL Server 데이터베이스를 선택하고 데이터베이스에 MoviesDB.mdf라는 이름을 지정하고 추가 단추를 클릭합니다.
  3. MoviesDB.mdf 파일을 두 번 클릭하여 서버 Explorer/데이터베이스 Explorer 창을 엽니다.
  4. MoviesDB.mdf 데이터베이스 연결을 확장하고 Tables 폴더를 마우스 오른쪽 단추로 클릭한 다음 메뉴 옵션 새 테이블 추가를 선택합니다.
  5. 테이블 Designer ID, 제목 및 디렉터 열을 추가합니다.
  6. 저장 단추(플로피의 아이콘이 있음)를 클릭하여 새 테이블을 Movies라는 이름으로 저장합니다.

Movies 데이터베이스 테이블을 만든 후에는 테이블에 몇 가지 샘플 데이터를 추가해야 합니다. 영화 테이블을 마우스 오른쪽 단추로 클릭하고 테이블 데이터 표시 메뉴 옵션을 선택합니다. 표시되는 그리드에 가짜 영화 데이터를 입력할 수 있습니다.

ADO.NET 엔터티 데이터 모델 만들기

Entity Framework를 사용하려면 엔터티 데이터 모델을 만들어야 합니다. Visual Studio 엔터티 데이터 모델 마법사 를 활용하여 데이터베이스에서 엔터티 데이터 모델을 자동으로 생성할 수 있습니다.

다음 단계를 수행합니다.

  1. 솔루션 탐색기 창에서 Models 폴더를 마우스 오른쪽 단추로 클릭하고 메뉴 옵션 추가, 새 항목을 선택합니다.
  2. 새 항목 추가 대화 상자에서 데이터 범주를 선택합니다(그림 1 참조).
  3. ADO.NET 엔터티 데이터 모델 템플릿을 선택하고 엔터티 데이터 모델에 MoviesDBModel.edmx라는 이름을 지정하고 추가 단추를 클릭합니다. 추가 단추를 클릭하면 데이터 모델 마법사가 시작됩니다.
  4. 모델 콘텐츠 선택 단계에서 데이터베이스에서 생성 옵션을 선택하고 다음 단추를 클릭합니다(그림 2 참조).
  5. 데이터 연결 선택 단계에서 MoviesDB.mdf 데이터베이스 연결을 선택하고 엔터티 연결 설정 이름 MoviesDBEntities를 입력한 후 다음 단추를 클릭합니다(그림 3 참조).
  6. 데이터베이스 개체 선택 단계에서 동영상 데이터베이스 테이블을 선택하고 마침 단추를 클릭합니다(그림 4 참조).

이러한 단계를 완료하면 ADO.NET 엔터티 데이터 모델 Designer(엔터티 Designer)이 열립니다.

그림 1 - 새 엔터티 데이터 모델 만들기

clip_image002

그림 2 - 모델 콘텐츠 단계 선택

clip_image004

그림 3 - 데이터 연결 선택

clip_image006

그림 4 - 데이터베이스 개체 선택

clip_image008

ADO.NET 엔터티 데이터 모델 수정

엔터티 데이터 모델을 만든 후 엔터티 Designer 활용하여 모델을 수정할 수 있습니다(그림 5 참조). 언제든지 솔루션 탐색기 창 내의 Models 폴더에 포함된 MoviesDBModel.edmx 파일을 두 번 클릭하여 엔터티 Designer 열 수 있습니다.

그림 5 - ADO.NET 엔터티 데이터 모델 Designer

clip_image010

예를 들어 엔터티 Designer 사용하여 엔터티 모델 데이터 마법사에서 생성하는 클래스의 이름을 변경할 수 있습니다. 마법사에서 Movies라는 새 데이터 액세스 클래스를 만들었습니다. 즉, 마법사는 클래스에 데이터베이스 테이블과 동일한 이름을 지정했습니다. 이 클래스를 사용하여 특정 Movie instance 나타내기 때문에 클래스의 이름을 Movies에서 Movie로 바꿔야 합니다.

엔터티 클래스의 이름을 바꾸려면 Entity Designer 클래스 이름을 두 번 클릭하고 새 이름을 입력할 수 있습니다(그림 6 참조). 또는 엔터티 Designer 엔터티를 선택한 후 속성 창 엔터티의 이름을 변경할 수 있습니다.

그림 6 – 엔터티 이름 변경

clip_image012

저장 단추(플로피 디스크의 아이콘)를 클릭하여 수정한 후 엔터티 데이터 모델을 저장해야 합니다. 백그라운드에서 Entity Designer C# 클래스 집합을 생성합니다. MoviesDBModel을 열어 이러한 클래스를 볼 수 있습니다. 솔루션 탐색기 창에서 Designer.cs 파일입니다.

다음에 Entity Designer 사용할 때 변경 내용을 덮어쓰기 때문에 Designer.cs 파일에서 코드를 수정하지 마세요. Designer.cs 파일에 정의된 엔터티 클래스의 기능을 확장하려는 경우 별도의 파일에 부분 클래스를 만들 수 있습니다.

Entity Framework를 사용하여 데이터베이스 레코드 선택

영화 레코드 목록을 표시하는 페이지를 만들어 무비 데이터베이스 애플리케이션 빌드를 시작하겠습니다. 목록 1의 홈 컨트롤러는 Index()라는 작업을 노출합니다. Index() 작업은 Entity Framework를 활용하여 Movie 데이터베이스 테이블의 모든 영화 레코드를 반환합니다.

목록 1 – Controllers\HomeController.cs

using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;

namespace MovieEntityApp.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        MoviesDBEntities _db;

        public HomeController()
        {
            _db = new MoviesDBEntities();
        }

        public ActionResult Index()
        {
            ViewData.Model = _db.MovieSet.ToList();
            return View();
        }

    }
}

목록 1의 컨트롤러에는 생성자가 포함되어 있습니다. 생성자는 _db 라는 클래스 수준 필드를 초기화합니다. _db 필드는 Microsoft Entity Framework에서 생성된 데이터베이스 엔터티를 나타냅니다. _db 필드는 Entity Designer 생성된 MoviesDBEntities 클래스의 instance.

홈 컨트롤러에서MoviesDBEntities 클래스를 사용하려면 MovieEntityApp.Models 네임스페이스(MVCProjectName)를 가져와야 합니다. 모델).

_db 필드는 Index() 작업 내에서 Movies 데이터베이스 테이블에서 레코드를 검색하는 데 사용됩니다. 식 _db. MovieSet은 Movies 데이터베이스 테이블의 모든 레코드를 나타냅니다. ToList() 메서드는 영화 집합을 Movie 개체의 제네릭 컬렉션(List<Movie>)으로 변환하는 데 사용됩니다.

영화 레코드는 LINQ to Entities 도움을 받아 검색됩니다. 목록 1의 Index() 작업은 LINQ 메서드 구문을 사용하여 데이터베이스 레코드 집합을 검색합니다. 원하는 경우 LINQ 쿼리 구문을 대신 사용할 수 있습니다. 다음 두 문은 동일한 작업을 수행합니다.

ViewData.Model = _db.MovieSet.ToList();
ViewData.Model = (from m in _db.MovieSet select m).ToList();

가장 직관적인 LINQ 구문(메서드 구문 또는 쿼리 구문)을 사용합니다. 두 방법 간의 성능 차이는 없습니다. 유일한 차이점은 스타일입니다.

목록 2의 보기는 영화 레코드를 표시하는 데 사용됩니다.

목록 2 – Views\Home\Index.aspx

<%@ Page Language="C#"  
  Inherits="System.Web.Mvc.ViewPage<List<MovieEntityApp.Models.Movie>>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
    
<% foreach (var m in ViewData.Model)
   { %>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%= Html.ActionLink("Edit", "Edit", new { id = m.Id })%>
    <%= Html.ActionLink("Delete", "Delete", new { id = m.Id })%>
       
        <hr />
<% } %>

<%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

목록 2의 보기에는 각 영화 레코드를 반복하고 영화 레코드의 제목 및 디렉터 속성 값을 표시하는 foreach 루프가 포함되어 있습니다. 편집 및 삭제 링크가 각 레코드 옆에 표시됩니다. 또한 동영상 추가 링크가 보기 아래쪽에 표시됩니다(그림 7 참조).

그림 7 - 인덱스 보기

clip_image014

인덱스 보기는 형식화된 뷰입니다. 인덱스 보기에는 Model 속성을 Movie 개체의 강력한 형식의 제네릭 List 컬렉션(동영상 목록<)으로 캐스팅하는 Inherits 특성이 있는 %@ Page %> 지시문이 포함되어 <있습니다.

Entity Framework를 사용하여 데이터베이스 레코드 삽입

Entity Framework를 사용하여 데이터베이스 테이블에 새 레코드를 쉽게 삽입할 수 있습니다. 목록 3에는 Movie 데이터베이스 테이블에 새 레코드를 삽입하는 데 사용할 수 있는 홈 컨트롤러 클래스에 추가된 두 개의 새 작업이 포함되어 있습니다.

목록 3 – Controllers\HomeController.cs(메서드 추가)

public ActionResult Add()
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
    var movieToAdd = new Movie();

    // Deserialize (Include white list!)
    TryUpdateModel(movieToAdd, new string[] { "Title", "Director" }, form.ToValueProvider());

    // Validate
    if (String.IsNullOrEmpty(movieToAdd.Title))
        ModelState.AddModelError("Title", "Title is required!");
    if (String.IsNullOrEmpty(movieToAdd.Director))
        ModelState.AddModelError("Director", "Director is required!");

    // If valid, save movie to database
    if (ModelState.IsValid)
    {
        _db.AddToMovieSet(movieToAdd);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Otherwise, reshow form
    return View(movieToAdd);
}

첫 번째 Add() 작업은 단순히 뷰를 반환합니다. 보기에는 새 영화 데이터베이스 레코드를 추가하기 위한 양식이 포함되어 있습니다(그림 8 참조). 양식을 제출하면 두 번째 Add() 작업이 호출됩니다.

두 번째 Add() 작업은 AcceptVerbs 특성으로 데코레이트됩니다. 이 작업은 HTTP POST 작업을 수행할 때만 호출할 수 있습니다. 즉, 이 작업은 HTML 양식을 게시할 때만 호출할 수 있습니다.

두 번째 Add() 작업은 ASP.NET MVC TryUpdateModel() 메서드의 도움을 받아 Entity Framework Movie 클래스의 새 instance 만듭니다. TryUpdateModel() 메서드는 Add() 메서드에 전달된 FormCollection의 필드를 가져와서 이러한 HTML 양식 필드의 값을 Movie 클래스에 할당합니다.

Entity Framework를 사용하는 경우 TryUpdateModel 또는 UpdateModel 메서드를 사용하여 엔터티 클래스의 속성을 업데이트할 때 속성의 "안전 목록"을 제공해야 합니다.

다음으로, Add() 작업은 몇 가지 간단한 양식 유효성 검사를 수행합니다. 이 작업은 Title 및 Director 속성에 모두 값이 있음을 확인합니다. 유효성 검사 오류가 있는 경우 유효성 검사 오류 메시지가 ModelState에 추가됩니다.

유효성 검사 오류가 없으면 Entity Framework의 도움을 받아 새 영화 레코드가 Movies 데이터베이스 테이블에 추가됩니다. 새 레코드는 다음 두 줄의 코드를 사용하여 데이터베이스에 추가됩니다.

_db.AddToMovieSet(movieToAdd);
_db.SaveChanges();

첫 번째 코드 줄은 Entity Framework에서 추적하는 영화 세트에 새 Movie 엔터티를 추가합니다. 두 번째 코드 줄은 기본 데이터베이스로 다시 추적되는 Movies의 변경 내용을 저장합니다.

그림 8 – 추가 보기

clip_image016

Entity Framework를 사용하여 데이터베이스 레코드 업데이트

방금 새 데이터베이스 레코드를 삽입하기 위해 수행한 방식과 거의 동일한 방법으로 Entity Framework를 사용하여 데이터베이스 레코드를 편집할 수 있습니다. 목록 4에는 Edit()라는 두 개의 새 컨트롤러 작업이 포함되어 있습니다. 첫 번째 Edit() 작업은 영화 레코드를 편집하기 위한 HTML 양식을 반환합니다. 두 번째 Edit() 작업은 데이터베이스를 업데이트하려고 시도합니다.

목록 4 – Controllers\HomeController.cs(메서드 편집)

public ActionResult Edit(int id)
{
    // Get movie to update
    var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

    ViewData.Model = movieToUpdate;
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form)
{
    // Get movie to update
    var id = Int32.Parse(form["id"]);
    var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

    // Deserialize (Include white list!)
    TryUpdateModel(movieToUpdate, new string[] { "Title", "Director" }, form.ToValueProvider());

    // Validate
    if (String.IsNullOrEmpty(movieToUpdate.Title))
        ModelState.AddModelError("Title", "Title is required!");
    if (String.IsNullOrEmpty(movieToUpdate.Director))
        ModelState.AddModelError("Director", "Director is required!");

    // If valid, save movie to database
    if (ModelState.IsValid)
    {
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Otherwise, reshow form
    return View(movieToUpdate);
}

두 번째 Edit() 작업은 편집 중인 동영상의 ID와 일치하는 데이터베이스에서 영화 레코드를 검색하여 시작합니다. 다음 LINQ to Entities 문은 특정 ID와 일치하는 첫 번째 데이터베이스 레코드를 가져옵니다.

var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

다음으로 TryUpdateModel() 메서드를 사용하여 HTML 양식 필드의 값을 영화 엔터티의 속성에 할당합니다. 업데이트할 정확한 속성을 지정하기 위해 안전 목록이 제공됩니다.

다음으로, 영화 제목 및 디렉터 속성에 값이 모두 있는지 확인하기 위해 몇 가지 간단한 유효성 검사가 수행됩니다. 두 속성 중 하나에 값이 없으면 유효성 검사 오류 메시지가 ModelState에 추가되고 ModelState.IsValid는 false 값을 반환합니다.

마지막으로 유효성 검사 오류가 없으면 SaveChanges() 메서드를 호출하여 기본 Movies 데이터베이스 테이블이 변경 내용으로 업데이트됩니다.

데이터베이스 레코드를 편집할 때 편집 중인 레코드의 ID를 데이터베이스 업데이트를 수행하는 컨트롤러 작업에 전달해야 합니다. 그렇지 않으면 컨트롤러 작업은 기본 데이터베이스에서 업데이트할 레코드를 알 수 없습니다. 목록 5에 포함된 편집 보기에는 편집 중인 데이터베이스 레코드의 ID를 나타내는 숨겨진 양식 필드가 포함되어 있습니다.

목록 5 – Views\Home\Edit.aspx

<%@ Page Language="C#" 
  Inherits="System.Web.Mvc.ViewPage<MovieEntityApp.Models.Movie>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Edit</title>
    <style type="text/css">
    
    .input-validation-error
    {
        background-color:Yellow;
    }
    
    </style>    
</head>
<body>
    <div>

<h1>Edit Movie</h1>

<form method="post" action="/Home/Edit">

    <!-- Include Hidden Id -->
    <%= Html.Hidden("id") %>

    Title:
    <br />
    <%= Html.TextBox("title") %>
    
    <br /><br />
    Director:
    <br />
    <%= Html.TextBox("director") %>
    
    <br /><br />
    <input type="submit" value="Edit Movie" />
</form>
    
    </div>
</body>
</html>

Entity Framework를 사용하여 데이터베이스 레코드 삭제

이 자습서에서 해결해야 하는 최종 데이터베이스 작업은 데이터베이스 레코드를 삭제하는 것입니다. 목록 6의 컨트롤러 작업을 사용하여 특정 데이터베이스 레코드를 삭제할 수 있습니다.

목록 6 -- \Controllers\HomeController.cs(삭제 작업)

public ActionResult Delete(int id)
{
    // Get movie to delete
    var movieToDelete = _db.MovieSet.First(m => m.Id == id);

    // Delete 
    _db.DeleteObject(movieToDelete);
    _db.SaveChanges();

    // Show Index view
    return RedirectToAction("Index");
}

Delete() 작업은 먼저 작업에 전달된 ID와 일치하는 Movie 엔터티를 검색합니다. 그런 다음 DeleteObject() 메서드와 SaveChanges() 메서드를 차례로 호출하여 데이터베이스에서 동영상이 삭제됩니다. 마지막으로 사용자는 인덱스 보기로 다시 리디렉션됩니다.

요약

이 자습서의 목적은 ASP.NET MVC 및 Microsoft Entity Framework를 활용하여 데이터베이스 기반 웹 애플리케이션을 빌드하는 방법을 보여 주는 것이었습니다. 데이터베이스 레코드를 선택, 삽입, 업데이트 및 삭제할 수 있는 애플리케이션을 빌드하는 방법을 알아보았습니다.

먼저 엔터티 데이터 모델 마법사를 사용하여 Visual Studio 내에서 엔터티 데이터 모델을 생성하는 방법을 설명했습니다. 다음으로 LINQ to Entities 사용하여 데이터베이스 테이블에서 데이터베이스 레코드 집합을 검색하는 방법을 알아봅니다. 마지막으로 Entity Framework를 사용하여 데이터베이스 레코드를 삽입, 업데이트 및 삭제했습니다.