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을 하고 있지 않다면 예외 발생
- 삭제하기 위해 OnDelete 함수를 호출하고 ClientSetNull 모드를 인자로 사용
- 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 |