대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(5) EF Core

State 조작

monstro 2025. 8. 26. 17:16
728x90
반응형

- 개요

엔티티 클래스의 프로퍼티의 State를 직접 조작하면 특정 프로퍼티만을 수정할 수 있어 유리합니다.

State의 직접 조작은 다음의 3가지 방식으로 수행할 수 있습니다.

  • 일반적인 State 조작 방법 : Entry().State = EntityState.설정할State
    • 특정 Property에 대한 State 조작 방법 : Entry().Property("프로퍼티이름").IsModified = true
  • TrackedGraph : 일일이 프로퍼티를 찾지 않고 Relationship이 있는 Untracked 상태의 엔티티의 State 조작
  • ChangeTracker : State 정보의 변화를 감지하여 특정 데이터를 조작하고 싶은 경우 유용함
    • 1) SaveChanges 함수를 오버라이드
    • 2) 오버라이드된 로직에서 ChangeTracker.Entries를 사용하여 바뀔 정보를 추출하여 사용

 

1) 일반적인 State 조작 방법

 

DBCommands의 TestUpdateAttach 함수를 위와 같이 수정하였습니다.

생성한 Player 엔티티 클래스의 인스턴스에 대해 State를 직접 조작하여 Tracking될 수 있도록 설정하였습니다.

 

2) TrackedGraph

 

1)과 동일한 함수에서 TrackedGrapth를 사용하여 Untrack 상태특정 프로퍼티만을 수정할 수 있습니다.

예시에서는 Player 엔티티 클래스의 Name만을 수정하도록 구성하였습니다.

 

3) ChangeTracker

3 - 1) DataModel 클래스

 

데이터가 만들어진 시간 추적하기 위한 인터페이스를 생성합니다.

CreateTime 프로퍼티를 사용하여 시간을 저장하고, SetCreateTime 함수로 프로퍼티를 설정합니다.

 

 

Player 엔티티 클래스가 ILogEntity 인터페이스를 상속받도록 구조를 변경합니다.

CreateTime 프로퍼티를 추가하고, SetCreateTime 함수를 오버라이드합니다.

 

3 - 2) AppDBContext 클래스

 

SaveChanges 함수를 위와 같이 오버라이드합니다.

Tracking되고 있는 엔티티 클래스ILogEntity 인터페이스를 상속받았다면 SetCreateTime 함수를 실행합니다.

 

- 최종 실행 결과

 

Player 테이블에 의도한 결과대로 데이터들이 설정된 것을 확인할 수 있습니다.

 

 

Item 테이블의 경우 TrackedGraph 방식에서 Player 엔티티 클래스만 수정하도록 명시하여 

위와 같이 아무 데이터도 추가되지 않은 것을 확인할 수 있습니다.

728x90
반응형

'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (5) EF Core' 카테고리의 다른 글

SQL 직접 호출과 로깅  (0) 2025.08.26
Entity State & Relationship (2)  (0) 2025.08.26
Entity State & Relationship (1)  (0) 2025.08.26
Migration  (0) 2025.08.25
Default Value  (0) 2025.08.25