Data Modeling Config

Eunho Bae·2022년 7월 1일
0
post-thumbnail

Configuration

Convention

  • 각종 형식과 이름 등을 정해진 규칙에 맞게 만들면, EF Core에서 알아서 처리해준다.
  • 쉽고 빠르지만, 모든 경우를 처리할 수는 없다.

규칙

Entity class 관련

  • public 접근 한정자와 non-static 멤버
  • property 중에서 public getter를 찾으면서 분석
  • property 이름이 곧 table column 이름으로 매핑

이름, 형식, 크기 관련

  • .NET 형식 <-> SQL 형식(int, bool)
  • .NET 형식의 Nullable 여부 따라감. (string은 nullable, int는 non-null, int?는 nullable)

주키 관련

  • Id 혹은 <클래스이름>Id로 정의된 property가 주키로 인정
  • 복합키는 convention으로 처리 불가. 즉 ItemId와 TemplateId를 묶음으로 주키로 설정하고 싶은 경우 convention 방식으로 처리가 안됨

ex) ItemId, PlayerId, GuildId

Data Annotation (데이터 주석)

  • class/property 등에 attribute를 붙여 추갖 정보를 제공

ex) [Table("Item")]

Fluent API (직접 정의)

  • OnModelCreating에서 직접 설정 정의
  • 활용 범위가 가장 넓다

DB column type, size, nullable

Nullable [Required] .isRequired()
문자열 길이 [MaxLength(20)] .HasMaxLength(20)
문자 형식 .IsUnicode(true)

    [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; }
    }

주키

복합키를 설정하려면

        [Key]
        [Column(Order = 0)]
        public int ItemId { get; set; }
        [Key]
        [Column(Order = 1)]
        public int TemplateId { get; set; }

또는

protected override void OnModelCreating(ModelBuilder builder)
{
      builder.Entity<Item>().HasKey(x => new { x.ItemId, x.TemplateId });
}

인덱스

        protected override void OnModelCreating(ModelBuilder builder)
        {
            // 인덱스 추가
            builder.Entity<Item>().HasIndex(p => p.ItemId);

            // 복합 인덱스 추가
            builder.Entity<Item>().HasIndex(p => new { p.ItemId, p.TemplateId });
            
            // 인덱스 이름을 정해서 추가
            builder.Entity<Item>().HasIndex(p => p.ItemId).HasName("Index_ItemId");
            
            // 유니크 인덱스 추가
            builder.Entity<Item>().HasIndex(p => p.ItemId).IsUnique();
        }

테이블 이름

[Table("MyTable")] 또는

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Item>().ToTable("MyTable");
        }

칼럼 이름

  • 기본적으로 property 이름을 따라간다.
  • [Column("MyCol")] 또는 .HasColumnName("MyCol")

코드 모델링에서는 사용하되, DB 모델링에서는 제외하고 싶은 경우(property/class 모두 가능)

코딩을 도와주는 용도로 메모리에서만 들고 있도록 Entity 클래스를 정의하고 싶다면

[NotMapped] 또는 OnModelCreating에서 .Ignore() 사용

우선순위

Convention < Data Annotation < Fluent API 순으로 우선순위가 존재한다.

profile
개인 공부 정리

0개의 댓글