728x90
반응형
- 개요
Configuration은 Entity 클래스간의 관계나 속성등을 DB에 매핑하는 방법을 정의하는 것을 의미합니다.
Configuration을 수행하는 방법은 총 3가지가 존재합니다.
- Convention : 데이터에 대한 형식을 미리 정의하여 EF-Core에서 형식에 맞춰 알아서 처리
- Data Annotation : Entity 클래스의 클래스 이름이나 Property에 어트리뷰트를 수식
- Fluent API : OnModelCreating 함수에서 직접 설정을 정의
각각의 사용예시는 다음과 같습니다.
public class Item
{
public int ItemId { get; set; }
}
위의 예시는 Convention 방식입니다.
[Table("Player")]
public class Player
{
public int PlayerId { get; set; }
[Required]
[MaxLength(20)]
public string Name { get; set; }
public Item Item { get; set; }
public Guild? Guild { get; set; }
}
위의 예시는 Data Annotation 방식입니다.
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Item>().HasQueryFilter(i => i.SoftDeleted == false);
modelBuilder.Entity<Player>()
.HasIndex(p => p.Name)
.HasName("Index_Person_Name")
.IsUnique();
}
위의 예시는 Fluent API 방식입니다.
- Convention 방식을 통한 Configuration 작성시의 주의사항
Configuration 방식에서 우선순위는 다음과 같습니다.
- 3) Configuration
- 2) Data Annotation
- 1) Fluent API
위에서 아래로 갈수록 우선순위가 높아지게 됩니다.
따라서 Configuration 방식을 사용하면 가장 간단한 방식으로만 Configuration을 작성할 수 있습니다.
1) Entity 클래스 관련
- 클래스는 반드시 public 접근 제어자 + non-static으로 정의
- EF-Core는 property 중에서 public getter를 찾으면서 분석
- property 이름 = 테이블의 열 이름
2) 이름, 형식, 크기 관련
- .Net 형식의 데이터는 SQL 형식의 데이터에 대응함
- .NET 형식으로 작성된 Nullable 여부를 따라감
3) 기본키 관련
- id 혹은 클래스이름+id로 작성하고 이렇게 정의된 property는 기본키로 인정, 후자의 방식이 권장됨
- 단, 복합키는 Convention 방식에서 처리가 불가능함
- 3가지 Configuration 방식의 사용
1) Nullable을 3가지 Configuration 방식으로 처리
- Convention 방식 : Nullable
- Data Annotation 방식 : [Reguired]
- Fluent API 방식 : .IsRequired()
2) 문자열 길이를 3가지 Configuration 방식으로 처리
- Convention 방식 : 없음
- Data Annotation 방식 : [MaxLength(20)]
- Fluent API 방식 : .HasMaxLength(20)
3) 문자 형식을 3가지 Configuration 방식으로 처리
- Convention 방식 : 없음
- Data Annotation 방식 : 없음
- Fluent API 방식 : .IsUnicode(true)
4) 기본키를 3가지 Configuration 방식으로 정의
- Convention 방식 : id 또는 Entity클래스이름 + id
- Data Annotation 방식 : [Key][Column(Order=0)] [Key][Column(Order=1)]
- Fluent API 방식 : .HasKey(x => new {x.Prop1, x.Prop2})
5) Fluent API 방식으로 Index를 추가(Fluent API에서만 가능)
- Index를 추가 : .HasIndex(p => p.Prop1)
- 복합 Index를 추가 : .HasIndex(p => new {p.Prop1, p.Prop2})
- Index 이름을 정해서 추가 : .HasIndex(p => p.Prop1).HasName("Index_MyProp")
- 고유 Index를 추가 : .HasIndex(p => p.Prop1).IsUnique()
6) 테이블 이름을 3가지 Configuration 방식으로 설정
- Convention 방식 : DbSet<T> 프로퍼티이름 또는 클래스이름
- Data Annotation 방식 : [Table("MyTable")]
- Fluent API 방식 : .ToTable("MyTable")
7) 열 이름을 3가지 Configuration 방식으로 설정
- Convention 방식 : property 이름
- Data Annotation 방식 : [Column("MyCol")]
- Fluent API 방식 : .HasColumnName("MyCol")
8) 코드 모델링에서는 사용하되, DB 모델링에서는 제외하고 싶은 경우
- Convention 방식 : 없음
- Data Annotation 방식 : [NotMapped]
- Fluent API 방식 : .Ignore()
9) Soft Delete의 구현(Fluent-API에서만 가능)
- Fluent API 방식 : .HasQueryFilter()
- 결론
3가지 Configuration 방식을 사용하는 시점은 다음과 같이 정리할 수 있습니다.
- Convention 방식 : 일반적인 상황에서 가장 무난하게 사용가능
- Data Annotation 방식 : Validation과 관련한 요소들은 Data Annotation이 유리함
- Fluent API 방식 : 그 외의 경우는 Fluent API 사용
728x90
반응형
'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (5) EF Core' 카테고리의 다른 글
| Shadow Property & Backing Field (0) | 2025.08.19 |
|---|---|
| Relationship Configuration (0) | 2025.08.18 |
| Delete (0) | 2025.08.12 |
| Relationship Update (0) | 2025.08.12 |
| 외래키와 Nullable (0) | 2025.08.11 |