본문 바로가기

Entity Framework Core

EFCore - Data Modelin config #Part8

학습 내용

1:1 방식의 Update와 1:다 방식의 Update차이

DB Model

1. Item 

기존 Item 모델

테스트를 위한 신규 아이템 모델

 

 

 

2. Player

 

 

3. Guild 

 

 

DB 테이블

 1.Item

 

 2.player

 

 

3.Guild

 

 



차례

  1. Convention
  2. DataAnnotation
  3. Fluent Api

 

 

 

- 한번에 묶어서 

 

    //오늘의 주제 : Configuration 중요함
    //A) Convention (관례)
    //- 각종 형식과 이름들을 정해진 규칙에 맞게 만들면 , EF Core에서 알아서 처리함
    //- 쉽고 빠르지만 , 모든 경우를 처리 할 수는 없다.
    // 테이블을 만들때 Class + Id (itemId)를 만들어 자동으로 PK로 사용한단던가!
    // 규칙의 의해서 만들어진것들 
    //B) Data Annotation (데이터 주석)
    //- class /Property 등에 Attribute를 붙여 추가 정보를 
    // [Table("Class")] 등이 이에 해당함
    //C) Fluent Api (직접 정의)
    // OnModelCreating에서 그냥 직접 설정을 정의해서 만드는 '귀찮은' 방식
    // 하지만 사용범위가 가장 넓다 . 
    //  builder.Entity<Item>().HasQueryFilter(i => i.SoftDeleted == false); 등등


    //----------------- Convention -------------------
    // 1) Entity Class 관련
    // - public 접근 한정자 + non-static 
    // - property 중에서 "public" Getter를 찾으면서 분석   public int ItemId { get; set; } 등
    // - property 이름 = talbe column 이름
    // 2) 이름 ,형식 ,크기 관련 
    // - .NET 형식 <-> SQL 형식 (int,bool)
    // - .NET 기본 Nullable 여부를 따라감
    //     (string은 C#에서 기본적으로 Nullable임으로 DB에서도 Nullable 이고 int는 Non- Nullable이니
    //     DB에서도 기본적으로 Non-Nullbale로 만들어짐)
    // 3) PK 관련
    // - Id 혹은 <클래스이름>Id 정의된 propoerty는 pk로 인정 (후자 권장)
    // - 복합키(Composite Key) Convention으로 처리 불가능
    //   (itemID하나만이 아니라 TemplateId까지 묶음으로 처리한걸 FK사용하고싶은경우)
    //-----------------여기까지가 기본적인 사항 -------------------

    // 1)DB column , type , size , nullable
    //  위에 3가지를 다 적용한다고 하더라도 A,B,C 순으로 덮어 씌어진다.
    //  Convention을 사용한다하더라도  DataAnnotation을 사용하면 덮어 씌어지고 
    //  Fluent Api를 사용하면 또 떺어진다.

    // Nullablue [Required]
    //   Convention         Annotation          Fluent Api
    // EX int? test         [Required]          .IsRequired()
    //                      int test {get;set;}
    // 문자열길이
    //                      [MaxLength(20)]     .HaseMaxLength(20)
    // 문자형식 = 1바이트로 표현? 2바이트로 표현?
    //                                          .IsUnicode(true)

    // 2) 복합키 사용법 
    //Order는 상대적인 순서이다.
    // [Key]
    // [Column(Order = 0)]
    // public int ItemId { get; set; }
    // [Key]
    // [Column(Order = 1)] 
    // public int TemplateId { get; set; }

    // Fluent Api
    //.HasKey (x = > new {x.Porp1, x.Porp2})

    // 3) Index 
    // Fluent Api
    //인덱스 추가                    .HasIndex (p => P.Prop1)
    //복합 인덱스 추가               .HasIndex (p => new(p.Prop1, p.prop2))
    //인덱스 이름을 정해서 추가       .HasIndex (p => P.Prop1).HasName("Index_MyProp")
    //유니크 인덱스 추가              .HasIndex (p => P.Prop1).IsUnique()

    // 4) Table 
    // DBset<T> property 이름 or class이름
    // public DbSet<Item> Items { get; set; }
    // public DbSet<Player> Players { get; set; }
    // public DbSet<Guild> Guilds { get; set; } 
    //등등
    //이런 이름이 없다고하면 
    //Class 이름을 기본적으로 사용하고 
    //만약에 [Table("MyTable")]을 사용한다면 MyTable이 된다.
    // Fluent Api
    // .ToTable("MyTable")

    //5) 칼럼 이름 
    // Property 이름
    // [Column("MyCol")]  .HasColumName("MyCol")

    //6 코드 모델링에서는 사용하되, DB모델에서는 제외하고 싶다면?(property/ class 모두 사용가능)
    // 모델 코드에서는 public int Test {get;set;} 을 사용하고 싶지만 
    //DB에서는 존재 조차 모르게하고싶다.
    //[NotMapped]를 사용한다 
    //class도 사용가능하다.
    // Fluent Api
    // .Igonre()

    //7) Soft Delete
    // .HasQueryFilter()를 사용한다.


    //8) 언제 무엇을 사용해야한다?
    //기본적으로 A-B-C 순서 
    //1) Convention이 가장 무난 
    //2) 뭔가 Validation과 관련된 부분들은 Data Annotation (직관적, SaveChages 호출)
    //3) 그 외에는 Fluent Api