[C# 강좌 - 70] Entity Framework 설정하기


Study/C#  2019. 7. 3. 09:00

안녕하세요. 명월입니다.


이 글은 C#의 ORM인 entity framework를 사용하는 방법입니다.


먼저 ORM의 대한 설명을 간단하게 하겠습니다. ORM이란 Object-relational mapping(객체 관계 매핑)의 약자로써 흔히 데이터 베이스의 트리 구조의 테이블 값을 Java나 C#같은 객체 지향의 Class list구조로 변환시키는 프레임 워크를 이야기합니다.

즉, ORM을 통해서 데이터 베이스의 값을 읽어오면 자동으로 List<테이블 레코드 타입> 형식으로 return 해주는 프레임 워크입니다.


예전에는 저도 프로그램 상에서 쿼리를 직접 사용한 적이 있습니다. 물론 이 방법이 잘 못되었다는 건 아닙니다만, 프로그램 상에 쿼리를 직접 사용하게 되면 후에 수정이 어렵다는 치명적인 단점이 있습니다.

예를 들면 테이블 구조가 idx, data, createddate, isdeleted 식의 구조에서 물론 데이터가 추가되면 상관이 없겠지만 createddate컬럼이 삭제된다고 할 때, 「select idx, data, createddate from 테이블명」을 사용한 코드는 에러가 발생할 것입니다.

직접 명시 컬럼명을 피한다고 해도, 결과 값에 createddate값을 받는 클래스의 변수가 있다면 null을 발생하거나 예상치 못한 에러를 발생시킬 위험이 있습니다.


그럼 이런 것을 방지하기 위해선 어떻게 해야할까? 쿼리를 String형식으로 표현하는 것이 아닌 프로그램 언어, 즉, 컴파일에 걸리기 가능하게끔 처리하는 것입니다. 그럼 수정이 생긴다고 해도 그 수정 내용을 알기 쉽겠습니다.

그런 역할을 하는 것이 entityframe워크 입니다. 설명이 거창한데 실제 사용하면 별거 아닙니다.


먼저 entity를 사용하기 위해서 Nuget을 통해 라이브러리를 다운로드 받습니다.

일단 entityframe워크를 설치했습니다. entityframe워크는 기본적으로 데이터 베이스 링크이기 때문에 데이터 베이스를 만들어야 겠습니다.

CREATE DATABASE EFExample;
use EFExample;

create table Test1(
  idx int identity(1,1) primary key,
  data varchar(255),
  createddate datetime,
  isdeleted bit
)

create table Test2(
  idx int identity(1,1) primary key,
  fidx int,
  data varchar(255)

  foreign key(fidx) references Test1(idx)
)

위와 같이 데이터 베이스를 만들었습니다. 예로 Test1과 Test2의 연결 참조도 했습니다.

그리고 Entity data model를 하나 추가합니다.

Database connection 정보와 연결을 하고 Context 이름을 정합니다. connection 정보가 없을 경우는 옆에 new Connection을 누르고 설정하면 됩니다.

그러면 테이블과 view 그리고 프로시져와 Function을 연결할 매핑 위자드가 나옵니다. 저의 경우는 Table 두개만 추가하였기 때문에 다른 것은 매핑이 되지 않네요.

연결이 완료가 되면 클래스가 자동으로 생성이 되고 ER도 같은 표시가 화면에 나타납니다.

이제 값을 하나 Insert해 보고 출력까지 해보겠습니다.

class Program
{
  static void Main(string[] args)
  {
    // entity framework의 context를 가져온다.
    using (var context = new EFExampleContext())
    {
      //Test1 테이블에 데이터를 하나 추가한다.
      context.Test1.Add(new Test1()
      {
        //data 컬럼에 hello world를 넣는다.
        data = "Hello world",
        // Referection 테이블 Test2에 data에 "reference Test"를 넣는다.
        Test2 = new List<Test2>(){
          context.Test2.Add(new Test2()
          {
            data = "reference Test"
          })
        }
      });
      context.SaveChanges();
    }

    Console.WriteLine("Press any key...");
    Console.ReadKey();

  }
}

결과를 보면 아주 깔끔하게 테이블에 Insert 되었습니다. 아까 초반에 이야기 했듯이 소스 상에 Sql query 하나 없이 데이터 베이스에 데이터가 들어갔습니다.

이번에는 반대로 데이터를 select 해보겠습니다.

class Program
{
  static void Main(string[] args)
  {
    // entity framework의 context를 가져온다.
    using (var context = new EFExampleContext())
    {
      // Test1 테이블에서 idx가 1인 레코드와 Test2에 연결되어 있는 데이터를 가져와라
      var list = context.Test1.Include(t => t.Test2).Where(x => x.idx == 1).ToList();
      foreach(var entity in list)
      {
        // 취득해온 데이터의 data값을 출력하라
        Console.WriteLine(entity.data);
        foreach(var reference in entity.Test2)
        {
          // 연결된 Test2테이블의 값의 data값을 출력하라.
          Console.WriteLine(reference.data);
        }
      }
    }

    Console.WriteLine("Press any key...");
    Console.ReadKey();

  }
}

결과를 보면 역시 Test1의 테이블의 값과 Test2의 테이블 값을 가져왔습니다. 역시 소스 상에는 sql query를 사용하지 않았습니다.


여기까지 C#의 ORM인 entity framework를 사용하는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.