티스토리 뷰
목차
Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트
Code First
- 기존의 데이터베이스가 있든지 없든지 그와 무관하게 테이블과 컬럼에 해당하는 클래스와 속성을 코딩하고 .edmx 파일 없이 코딩한 클래스와 속성을 엔티티 프레임워크에서 사용할 수 있다.
- 공식적인 이름은 코드 우선이지만 때때로 코드 전용(Code only)이라고 불리기도 한다.
- 개념적 모델과 저장 스키마 사이의 맵핑에 해당하는 사용자가 만든 클래스와 속성은 컨벤션(convention)과 특별한 맵핑 API에 의해 다뤄지게 된다.
- 만약 데이터베이스를 아직 가지고 있지 않다면 엔티티 프레임워크가 데이터베이스를 자동으로 생성하거나 모델이 변경된 경우 데이터베이스를 제거(Drop)한 후 재생성해준다.
- 코드 우선을 위해 개발된 데이터 접근 API는 DbContext 클래스를 기반으로 하고 있다.
- 또한 데이터베이스 우선 방식과 모델 우선 워크플로우에서도 사용된다.
[Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트]
예제는 방명록을 위한 Guest라는 클래스를 정의하고 있는데, 클래스의 각 속성은 Guest 라는 테이블에 1 대 1로 매핑된다.
이렇게 간단한 속성들로 정의되어 외부 Framework에 의존하지 않는 단순한 Entity 클래스를 POCO (Plain Old CLR Object) 클래스라 부르는데, 기본적으로 단순히 데이터를 저장했다 전달하는 역할을 한다.
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 |
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 |
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하여 리스트 요소를 하나씩 꺼내 쓰고 있다.
[Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트]
Entity Framework 6.3 예제, 코드 퍼스트와 데이터 퍼스트