'엔티티프레임워크'에 해당되는 글 1건

  1. 2015.09.18 Entity Framework
2015. 9. 18. 19:54

잡설

나는 Entity Framework는 그저 Link to SQL의 확장 정도로 인식해 왔다. 하지만 많은 유튜브 동영상 강좌를 보니 생각보다 다양한 하고 복잡한 프로그래밍 방식을 제공하는 것 같았다. 본인 프로그래밍 방식은 RDBMS에 프로시저 등을 생성하고 코드단에서 그 프로시저들을 호출하는 형태로 작업을 많이 해왔다. 그래서 최소한의 필요 데이터 만을 가져오는 것을 지향해서 테이블 단위의 Model을 생성하기 보다는 그때 그때 필요에 의해 모델들을 생성하다 보니 중복되는 code들이 늘어나는 것을 느꼈다. 특히 Relation에 엮여있는 테이블들의 데이터는 어떤 액션을 하느냐에 따라서 더 그런거 같더라.. 포스팅을 하는 지금 다시 생각해 보면 내가 한 코드단 모델링 방식은 잘 못 설계한 것이라는 생각이 든다. 잡설은 여기까지 하고 Entity Framework에 대한 사용법을 정리해보고자 한다.


Pre-Requisite

Entity Framework Power Tools 설치 (선택된 데이터베이스의 스키마를 자동으로 c#코드로 제너레이션 해준다.)

 - https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d (VS2015 지원안함)

 - https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838


Development Method

 - Database first: 데이터베이스에 접속하여 스키마를 통하여 모델과 엔티티를 자동생성

 - Model First: 비쥬얼 스튜디오에서 모델을 직접 설계하고 관계도를 만들면 엔티티가 자동생성 (ERD와 비슷)

 - Code First: 자동 생성 없이 엔티티와 DBContext를 상속받은 클래스를 개발자가 직접 작성


Package Manager Console

# entity framework 설치 (Nuget을 사용할 수 있다.)

PM> install-package entityframework


# 데이터베이스의 스키마 정보가 c# 코드로 생성(자동 제너레이션)

PM> enable-migrations


# 데이터베이스의 스키마와 c#코드상에 스키마 정보를 비교하여 변경된 스키마 정보를 yyyyMMddHHmmss_FileName이라는 c#파일로 생성

PM> add-migration FileName


# 아래 명령어를 통하여 변경된 스키마를 데이터베이스에 적용

PM> Update-Database


# 데이터베이스에 적용된 스키마 롤백 (선택된 파일의 상태때로 되돌아 간다. 즉, 선택 파일 이후에 변경되었던 스키마 정보는 모두 롤백된다.)

PM> Update-Database -targetmigration 마이그레이션파일명(.cs제외)


# 최초의 스키마 정보에서부터 타켓으로 변경된 스키마 정보(yyyyMMddHHmmss_FileName)가 스크립트로 생성

PM> Update-Database -Script -SourceMigration: @InitialDatabase - TargetMigration: yyyyMMddHHmmss_FileName


DbContext

public class Employee

{

  public string Id {get; set;}

  public string Name {get; set;}

}


public class EmployeeDBContext : DbContext

{

  public DbSet<Employee> Employees {get; set;}


  protected override void OnModelCreating(DbModelBuilder modelBuilder)

  {

    // 여기에 Entity의 컬럼 속성 및 테이블/프로시져 맵핑 등을 설정할 수 있다.

    // 테이블명이 복수형으로 만들어지는 것을 방지

    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    // Employee에 DB에 프로시져 자동 생성 및 맵핑

    modelBuilder.Entity<Employee>().MapToStoredProcedures

    (p => p.Insert(i => i.HasName("insertEmployee"))

               .Update(i => i.HasName("UpdateEmployee"))

               .Delete(i => i.HasName("DeleteEmployee")));

    base.OnModelCreating(modelBuilder)

  }

}


Pattern

 - Repositories Pattern

 - Unit of Work


DB Initializer

// DB 초기화 클래스 생성

public class DBInitializer : DropCreateDatabaseIfModelChanges<EmployeeDBContext>

{

  protected override void Seed(EmployeeDBContext context)

  {

    // 여기에 Context에 DataSet<Entity>로 선언된 프로퍼티의 기준 데이터를 생성해 줄 수 있다.

    base.Seed(context); 

  }

}

// Main() 함수나 Global.asax 의 실행부에 아래 함수를 호출하거나

System.Data.Entity.Database.SetInitializer(new DBInitializer());

// 또는 app.config나 web.config의 <entityframwork>에서 설정이 가능하다.

  <entityFramework>

    <contexts>

      <context type="Context Class Name, DLL Name">

        <databaseInitializer type="DBInitializer, DLL Name" />

      </context>

    </contexts>



Attribute

[SoftDelete("Property Name")]

모델 클래스에 SoftDelete()라는 속성을 선언하면 DB에 쿼리를 만드는 시점 Command Tree Interceptor 에서 그 쿼리를 가로채 실제 요청쿼리에 맞게 변환작업을 할 수 있게 한다.

이 기능이 구현하기 위해서는 Custom Attribute class 와 IDbCommandTreeInterceptor 인터페이스를 상속받은 class를 만들어 주어야 한다.


[DisplayFormat(DataFormatString = "{0:C0}")]



Tutorial

http://www.entityframeworktutorial.net/code-first/entity-framework-code-first.aspx


참조

https://www.youtube.com/playlist?list=PL6n9fhu94yhUPBSX-E2aJCnCR3-_6zBZx

https://www.youtube.com/watch?v=iwEG1M2ONrw

https://www.youtube.com/watch?v=vspEYmp6zWc

https://www.youtube.com/watch?v=i9Il79a2uBU

Posted by CoolDragon