본문 바로가기
C++ 200제/코딩 IT 정보

Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트

by vicddory 2018. 12. 5.

Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트


Code First


- 기존의 데이터베이스가 있든지 없든지 그와 무관하게 테이블과 컬럼에 해당하는 클래스와 속성을 코딩하고 .edmx 파일 없이 코딩한 클래스와 속성을 엔티티 프레임워크에서 사용할 수 있다.


- 공식적인 이름은 코드 우선이지만 때때로 코드 전용(Code only)이라고 불리기도 한다. 


- 개념적 모델과 저장 스키마 사이의 맵핑에 해당하는 사용자가 만든 클래스와 속성은 컨벤션(convention)과 특별한 맵핑 API에 의해 다뤄지게 된다. 


- 만약 데이터베이스를 아직 가지고 있지 않다면 엔티티 프레임워크가 데이터베이스를 자동으로 생성하거나 모델이 변경된 경우 데이터베이스를 제거(Drop)한 후 재생성해준다. 


- 코드 우선을 위해 개발된 데이터 접근 API는 DbContext 클래스를 기반으로 하고 있다. 


- 또한 데이터베이스 우선 방식과 모델 우선 워크플로우에서도 사용된다.


Entity Framework 6.3, 코드 퍼스트[Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트]


예제는 방명록을 위한 Guest라는 클래스를 정의하고 있는데, 클래스의 각 속성은 Guest 라는 테이블에 1 대 1로 매핑된다. 


이렇게 간단한 속성들로 정의되어 외부 Framework에 의존하지 않는 단순한 Entity 클래스를 POCO (Plain Old CLR Object) 클래스라 부르는데, 기본적으로 단순히 데이터를 저장했다 전달하는 역할을 한다.

Code First 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations.Schema;
 
namespace GuestBook.Models
{
    public class GuestDbContext : DbContext
    {
        public GuestDbContext() : base()
        {
        }
 
        public DbSet<Guest> Guests { get; set; }
    }
 
    [Table("Guest")]
    public class Guest
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime CreateDate { get; set; }
        public string Message { get; set; }
    }
}
cs

13번 라인

- 예제는 방명록을 위한 Guest라는 클래스를 정의하고 있는데, 클래스의 각 속성은 Guest 라는 테이블에 1 대 1로 매핑된다. 

- 이렇게 간단한 속성들로 정의되어 외부 Framework에 의존하지 않는 단순한 Entity 클래스를 POCO (Plain Old CLR Object) 클래스라 부르는데, 기본적으로 단순히 데이터를 저장했다 전달하는 역할을 한다.


7번 라인


- GuestDbContext 클래스는 EntityFramework (System.Data.Entity)의 DbContext 클래스로부터 파생된 클래스로 DbContext 클래스의 여러 기능을 상속받는다.


- GuestDbContext 생성자는 Base 클래스의 생성자를 호출하고 있는데 이를 통해 처음 GuestDbContext 객체가 생성되면 (Web.config의 정의에 따라) 기존 DB가 없는 경우 자동으로 DB를 생성하게 된다.


- Table("Guest")] 는 테이블 명을 명시적으로 지정한 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Controller의 Action 메서드들
 
// Guest 추가
public ActionResult AddGuest()
{
    string name = Request["name"];
    string msg = Request["msg"];
 
    var db = new GuestDbContext();
 
    Guest g = new Guest();
    g.Name = name;
    g.CreateDate = DateTime.Now;
    g.Message = msg;
 
    db.Guests.Add(g);
    db.SaveChanges();
 
    return RedirectToAction("ShowGuests");
}
 
// Guest 리스트
public ActionResult ShowGuests()
{
    var db = new GuestDbContext();
 
    // select top 10 * from guest order by id desc
    List<Guest> guests = db.Guests.OrderByDescending(p => p.Id).Take(10).ToList();
 
    return View(guests);
}
cs

28번 라인

- Controller에서 Entity Framework을 사용하는 예인데, AddGuest() 메서드에서 데이터를 INSERT 하고 ShowGuests() 에서 최근 10개의 레코드를 출력하고 있다.

1
2
3
4
5
6
7
8
9
10
11
@model List<GuestBook.Models.Guest>
 
<h2>Guests</h2>
 
foreach (var row in Model)
{
    <p>
        <div>ID: @row.Id, Name: @row.Name</div>
        <div>--- @row.Message</div>
    </p>
}
cs

- List<Guest> 타입인 guests 변수를 View(guests)와 같이 View 메서드의 파라미터로 전달하고 이렇게 넘겨진 모델 객체는 View에서 아래와 같이 @model로 전달된 모델 타입을 지정해 주고 (전체 네임스페이스 써야 함), View에서 Model이라는 속성을 사용하여 해당 모델 객체를 사용한다.


- 모델 객체가 리스트이므로 foreach에서 Model을 Iteration하여 리스트 요소를 하나씩 꺼내 쓰고 있다.


Database First

- 데이터베이스를 이미 가지고 있다면 엔티티 프레임워크가 기존의 데이터베이스 객체(예: 테이블과 컬럼)에 대응되는 클래스와 속성으로 이루어진 데이터 모델을 자동으로 생성해 준다. 

- 데이터베이스 구조(저장 스키마), 데이터 모델(개념적 모델) 그리고 이 두 모델 간 맵핑에 관한 정보들을 XML 구조로 된 .edmx 파일에 저장한다.

- 비주얼스튜디오는 .edmx 파일을 보여주고 편집할 수 있는 그래픽 방식의 엔티티 프레임워크 디자이너를 제공해준다.


Database First 엔티티 프레임워크[Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트]


Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트

댓글