Entity Framework Core 23

SQL 직접 호출과 로깅

- 개요LINQ로 처리할 수 없는 것을 처리해야 하거나 성능을 최적화해야 하는 경우상황에 따라 직접 만든 SQL을 호출하는 것이 훨씬 효율적입니다.SQL을 호출하는 방법은 다음의 3가지가 존재합니다.FromSql의 함수 사용 : FromSqlRaw / FromSqlInterpolated데이터를 가져오는 것은 가능하지만, 데이터를 수정하는 것은 불가ExecuteSql의 함수 사용 : ExecuteSqlRaw / ExecuteSqlInterplated데이터를 수정하는 것이 가능Reload : Tracked Entity가 존재하는 상황에서 DB와 엔티티 클래스를 동기화 또, EF-Core 프레임워크를 사용하면서 동작을 확인할 수 있는 로깅을 사용해보도록 하겠습니다. 1) 로깅 로깅을 사용하기 위해서는 위의 패..

State 조작

- 개요엔티티 클래스의 프로퍼티의 State를 직접 조작하면 특정 프로퍼티만을 수정할 수 있어 유리합니다.State의 직접 조작은 다음의 3가지 방식으로 수행할 수 있습니다.일반적인 State 조작 방법 : Entry().State = EntityState.설정할State특정 Property에 대한 State 조작 방법 : Entry().Property("프로퍼티이름").IsModified = trueTrackedGraph : 일일이 프로퍼티를 찾지 않고 Relationship이 있는 Untracked 상태의 엔티티의 State 조작ChangeTracker : State 정보의 변화를 감지하여 특정 데이터를 조작하고 싶은 경우 유용함1) SaveChanges 함수를 오버라이드2) 오버라이드된 로직에서 C..

Entity State & Relationship (2)

- 개요이번에는 Update와 Attach를 수행한 이후의 엔티티의 State 변화를 알아보도록 하겠습니다.EF-Core에서의 Update : Untracked Entity를 전체적으로 수정하기 위해 사용일반적인 Update : Tracked Entity를 가져오고 -> Porperty 수정 -> SaveChanges 함수 호출EF-Core에서의 Attach : Untracked Entity를 Tracked Entity로 변경 두 동작 모두 다음의 state 결과를 얻을 수 있습니다.DB에 의해 생성된 Key가 있으면서, C#의 기본값이 아니라면 -> 필요에 따라 Unchanged / Modified / DetachedDB에 의해 생성된 Key가 없거나, C#의 기본값이라면 -> Added - 실습 DB..

Entity State & Relationship (1)

- 개요DB와의 상호작용을 관리하는 DBContext 클래스에는 다음의 중요한 3가지 요소가 존재합니다.1) ChangeTracker : Tracking State와 관련된 요소, Entity의 상태 관리와 연관됨2) Database : Transaction / DB Creattion - Migration / Raw SQL과 관련된 요소3) Model : DB 모델링과 관련된 요소 위의 3가지 요소 중에서 ChangeTracker의 엔티티의 상태에 대해서 알아보겠습니다.엔티티의 상태는 다음의 3가지 방법으로 확인할 수 있습니다.1) Entry().State2) Entry().Property().IsModified3) Entry().Navigation().IsModified 일반적으로 State는 직관적으..

Migration

- 개요migration은 상태 관리의 일환으로,데이터베이스를 업데이트하여 모델과 동기화하면서 기존 데이터를 보존하는 방법을 의미합니다.항상 DB를 최신화하는 것이 아닌, snapshot을 찍어 작업한 시점의 데이터를 불러오는 것을 목적으로 합니다. - migration의 절차migration의 절차는 다음과 같이 이루어져 있습니다.1) migration 제작2) migration 적용 - migration의 제작패키지 관리자 콘솔에서 Add-Migration [Name]의 명령어를 입력하여 migration을 제작합니다. 이때 EntityFrameworkCore.Tools 플러그인이 설치되어 있어야 합니다. - Add-Migration 명령어의 절차Add-Migration 명령어는 다음의 절차를 거쳐..

Default Value

- 개요EF-Core 프레임워크에서 기본값을 설정하는 방법은 여러가지가 존재합니다.이때 기본값을 설정하는 방법에서 다음의 사항을 고려해야 합니다.Entity Class의 기본값으로 설정되는 경우 : SaveChanges() 함수를 호출해야 실제 DB에 적용DB 테이블의 기본값으로 설정되는 경우 : SaveChanges() 함수를 호출하지 않아도 실제 DB에 적용 1) Auto-Property Initializer - Entity Class의 기본값으로 설정 위와 같이 프로퍼티에 대입 연산자를 사용하여 데이터의 기본값을 설정할 수 있습니다.위와 같은 방식을 Auto-Property Initializer라고 부르고, 해당 방식은 Enity Class의 기본값을 설정합니다. 2) Fluent API 사용 -..

User Defined Function(UDF)

- 개요User Defined Function, 줄여서 UDF는 EF-Core에서 호출하는 사용자가 직접 만든 SQL을 의미합니다.UDF를 사용하면 연산을 컨텐츠 단계가 아닌, DB에서 수행할 수 있고EF-Core로 작성된 비효율적인 쿼리를 배제하여 사용할 수 있다는 장점이 있습니다. UDF를 사용하기 위해서는 3가지의 절차를 수행합니다.1) Configuration : EF-Core에서 static 함수를 생성2) 등록 : DB에서 사용할 쿼리를 정의3) 사용 1) DataModel 클래스 아이템에 대한 평점을 매기기 위한 ItemReview 엔티티 클래스를 추가합니다. Item 엔티티 클래스에 여러개의 ItemReview를 저장하는 Navigation Property를 추가합니다. 2) 메인 Pro..

Backing Field + Relationship

- 개요Backing Field는 private field를 DB에 매핑하는 것을 의미합니다.다른 테이블을 참조하고 있는 Navigation Property에서도 사용할 수 있는데,사용하게 되면 참조하는 다른 DB의 변경사항에 맞춰 데이터를 쉽게 동기화할 수 있습니다. 1) DataModel 클래스 아이템의 평점을 설정할 수 있는 ItemReview 엔티티 클래스를 추가하였습니다. Item 엔티티 클래스에 ItemReview를 저장하는 List를 priavate 멤버 변수(Backing Field)로 추가하였습니다.Backing Field에는 Reviews 프로퍼티로 접근할 수 있습니다. 아이템에 대한 평점은 AverageScore 속성으로 나타나며 함수들을 통해 값을 수정할 수 있습니다. 2) App..

Entity Class와 Data Table 연동

- 개요생성한 Entity 클래스를 Data Table과 연동하는 방법은 총 3개로 구성되어 있습니다.1) Owned Type : 일반 클래스를 Entity Class에 추가하는 개념Ownership의 개념으로 동작하므로 Relationship과 다르게 .include()가 필요없음 추가할 Entity Class의 테이블에 추가하는 경우 : .OwnsOne() 사용다른 Entity Class의 테이블에 추가하는 경우 : .OwnsOne().ToTable("테이블이름") 사용 2) Table Per Hierarchy(TPH) : 상속 관계의 여러 Class를 하나의 테이블에 매핑하는 개념Descriminator 열을 추가하여 여러 엔터티 타입을 구분 Convention으로 구현하는 경우 : class를 상..

Shadow Property & Backing Field

- 개요EF-Core에서 사용할 수 있는 Shadow Property와 Backing Field에 대해서 알아보겠습니다.두 개의 요소에 대해 다음과 같이 정리할 수 있습니다.Shadow Property : DB에는 존재하지만, Class에는 존재하지 않도록 설정하는 방식Backing Field : private field를 DB에 매핑하고, public getter로 가공하여 사용하는 방식 1) Shadow Property 사용예시1 - 1) AppDBContext 클래스...protected override void OnModelCreating(ModelBuilder modelBuilder){ ... // Shadow Property modelBuilder.Entity().Propert..