[EFCore] 상속 관계를 매핑해보자 : Table Per Hierarchy (THP) 만들기

2022. 9. 8. 11:54·공부/EFCore
728x90

 

게임 내에 여러 아이템 중 이벤트 기간 동안만 생성됐다가 기간이 끝나면 삭제되는 아이템이 있다. 그런 이벤트아이템은 기존 아이템의 모든 속성을 상속받고 자신의 특징으로는 사라지는 기한만을 설정한다. 이 두 아이템을 다른 테이블로 설정하기 보다는 같은 아이템 테이블에 넣고, 상속 여부만 체크해주는 편이 좋다. 이런 상황에서 THP를 사용하면 된다.

 

 

✅ Convention으로 만들기

 

public class EventItem : Item
{
    public DateTime DestroyDate { get; set; }
}

 

기존 아이템을 만드는 클래스에서 Item을 상속 받는 EventItem 클래스를 만들어준다.

 

new EventItem()
{
    TemplateId = 102,
    CreateDate = DateTime.Now,
    Owner = faker,
    DestroyDate = DateTime.Now,
},

 

기존 아이템을 생성하는 DbCommands -> CreateData 등에서 new EventItem()을 해준다.

 

public DbSet<EventItem> EventItems { get; set; }

 

DbSet으로 EventItem을 추가해준다. 

 

 

따로 설정해준 적 없는 Discriminator가 생기면서 위에서 만든 102번 아이템만 EventItem으로 정상적으로 생성됐다.

Convention의 경우 결국 2가지 DbSet이 생성되어 Item과 EventItem을 따로 관리해야 한다는 불편함이 있다.

 

 

✅ Fluent API로 만들기

 

기존에 만든 DbSet만 삭제하고 Fluent API 방식의 TPH를 만들어보자.

 

public enum ItemType
{
    NormalItem,
    EventItem
}

public class Item
{
    public ItemType Type { get; set; }
    // ... //
 }

 

일반 Item과 EventItem을 구분하기 위해 enum을 생성해준다.

 

builder.Entity<Item>()
    .HasDiscriminator(i => i.Type)
    .HasValue<Item>(ItemType.NormalItem)
    .HasValue<EventItem>(ItemType.EventItem);

 

AppDbContext에 코드를 추가해준다. Item은 NormalItem으로 EventItem은 EventItem으로 자동 설정된다.

 

 

간편하게 Type으로 상속 여부를 확인할 수 있다.

 

728x90

'공부 > EFCore' 카테고리의 다른 글

[EFCore] 초기값 설정하기  (0) 2022.09.09
[EFCore] 다수의 Entity Class를 하나의 테이블에 매핑하기  (0) 2022.09.08
[EFCore] Entity와 DB, Table 연동하기  (0) 2022.09.07
[EFCore] Shadow Property와 Backing Field  (0) 2022.09.07
[EFCore] 다수의 Navigational Property가 같은 클래스를 참조하는 상황, 어떻게 대처할까  (0) 2022.09.07
'공부/EFCore' 카테고리의 다른 글
  • [EFCore] 초기값 설정하기
  • [EFCore] 다수의 Entity Class를 하나의 테이블에 매핑하기
  • [EFCore] Entity와 DB, Table 연동하기
  • [EFCore] Shadow Property와 Backing Field
돌멩이수프
돌멩이수프
Information technology
  • 돌멩이수프
    WHAT DOES "IT" STAND FOR?
    돌멩이수프
  • 전체
    오늘
    어제
    • 분류 전체보기 (238)
      • 언어 (73)
        • html (3)
        • css (1)
        • java (6)
        • C (26)
        • C++ (2)
        • C# (29)
      • 공부 (7)
        • Unity (43)
        • 게임 서버 (26)
        • 네트워크 (5)
        • 데이터베이스 (7)
        • EFCore (19)
        • 기타 (14)
        • Git (5)
        • 운영체제 (1)
        • 소프트웨어공학 (21)
      • 2024-여름 (12)
      • 자기 관리 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    HTML
    C#
    자바
    tcp
    Entityfamework
    C언어
    게임서버
    라즈베리파이
    java
    unity
    네트워크
    디자인패턴
    백준
    C
    EFCore
    유니티
    코딩
    coding
    EntityFramework
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
돌멩이수프
[EFCore] 상속 관계를 매핑해보자 : Table Per Hierarchy (THP) 만들기
상단으로

티스토리툴바