대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(5) EF Core

Relationship Configuration

monstro 2025. 8. 18. 15:33
728x90
반응형

- 개요

Entity 클래스와 다른 Entity 클래스 간의 관계를 설정하는 방법을 알아보겠습니다.

 

- Relationship 관련 용어

Relationship과 관련한 용어는 다음과 같이 정리할 수 있습니다.

  • 1) Principal Entity : 의존되는 Entity
  • 2) Dependent Entity : 의존하는 Entity
  • 3) Navigational Property : 다른 Entity참조하는 프로퍼티
  • 4) Primary Key(기본키) : Entity빠르게 탐색하기 위한 고유한
  • 5) Foreign Key(외래키) : 참조하는 다른 Entity가르키기 위한
  • 6) Principal Key : 외래키 또는 대체키
  • 7) Alternate Key(대체키) : 기본키를 제외한 나머지
  • 8) Required Relationship : Not-Null인 프로퍼티 
  •  9) Optional Relationship : Null일 수 있는 프로퍼티

 

- Convention을 사용하는 경우 외래키 정의

Convention가장 간단하게 Configuration을 정의하는 방법입니다.

이때 Convention을 사용하여 외래키를 정의하는 방법은 다음과 같이 수행할 수 있습니다.

  • <ForeignKeyName>을 사용 : PlayerId(FKName)
  • <Class><ForeignKeyName>을 사용 : Player(클래스)PlayerId(FKName)
  • <NavigationPropertyName><ForeignKeyName>을 사용 : Owner(NP)PlayerId(FKName)

 

- 외래키와 Nullable 

외래키다른 Entity 클래스를 참조하기 위해 사용합니다.

이때 외래키Nullable 속성부여하느냐 / 않느냐에 따라 참조하는 데이터삭제하는 방식이 달라집니다.

  • Required Relationship(Not-Null)으로 설정한 경우
    • 삭제하기 위해 OnDelete 함수를 호출하고 Cascade 모드를 인자로 사용
    • Principal 데이터를 삭제하면 Dependent 데이터도 같이 삭제
  • Optional Relationship(Nullable)으로 설정한 경우
    • 삭제하기 위해 OnDelete 함수를 호출하고 ClientSetNull 모드를 인자로 사용
      • Principal 데이터를 삭제하려고 할때,  Dependent Tracking을 하고 있다면 외래키null로 세팅
      • Principal 데이터를 삭제하려고 할때, Dependent Tracking을 하고 있지 않다면 예외 발생

 

- Convention 방식으로 처리할 수 없는 설정

Convention 방식은 가장 간단하게 Configuration을 작성하므로 구현할 수 없는 몇가지 설정이 존재합니다.

  • 1) 복합 Foreign Key
  • 2) 다수의 Navigation Property같은 클래스를 참조하는 경우
  • 3) DB삭제 관련 커스터마이징이 필요한 경우

 

- Data Annotation 방식으로 Relationship 설정

어트리뷰트를 사용하는 Data Annotation 방식에서 관계를 설정하는 방법은 다음과 같습니다.

  • 하나의 Navigation Property하나의 클래스를 참조하는 경우 : [ForeignKey("Prop1")] 어트리뷰트
  • 다수의 Navigation Property하나의 클래스를 참조하는 경우 : [InverseProperty("Props")] 어트리뷰트

 

- Fluent API 방식으로 Relationship 설정

OnModelCreating 함수에서 로직을 작성하는 Fluent API 방식에서 관계를 설정하는 방법은 다음과 같습니다.

  • 본인 기준으로 1 : 1 관계 또는 1 : 多 관계인 경우 : .HasOne() 또는 .HasMany()
  • 상대 기준으로 1 : 1 관계 또는 1 : 多 관계인 경우 : .WithOne() 또는 .WithMany()
  • 두 Entity 클래스간외래키 지정 : .HasForeignKey()
    • 외래키에서 null을 지정 : .IsRequired()
  • 부모 Entity가 삭제될 때 자식 Entity에 대한 동작을 정의 : .OnDelete()
  • 외래키의 제약 조건 이름을 설정 :  .HasConstraintName()
  • 외래키를 설정 : .HasPrincipalKey()
728x90
반응형

'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (5) EF Core' 카테고리의 다른 글

Entity Class와 Data Table 연동  (0) 2025.08.19
Shadow Property & Backing Field  (0) 2025.08.19
Configuration  (0) 2025.08.18
Delete  (0) 2025.08.12
Relationship Update  (0) 2025.08.12