학습 내용
1:1 방식의 Update와 1:다 방식의 Update차이
DB Model
1. Item

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

2. Player

3. Guild

DB 테이블
1.Item

2.player

3.Guild

차례
- Convention
- DataAnnotation
- 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


'Entity Framework Core' 카테고리의 다른 글
EFCore - Shadow Property & Backing Field #Part10 (0) | 2023.11.28 |
---|---|
EFCore - Relationship Configuration #Part9 (0) | 2023.11.28 |
EFCore - Delete #Part7 (0) | 2023.11.20 |
EFCore - Update 1v1 1vM #Part6 (1) | 2023.11.17 |
EFCore - Foreing Key 와 Nullable #Part5 (0) | 2023.11.15 |