-
[EntityFrameWork Core] The instance of entity type cannot be tracked 오류 발생시 해결방안.NET/개념 및 유용한 팁 2021. 3. 27. 13:52반응형
개발 중 이런 오류가 발생했다.
The instance of entity type 'masterTbl' cannot be tracked because another instance with the same key value for {'idx', 'seq'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.
EFCore에서 검색한 객체를 ToList() 함수로 가져온 뒤, foreach를 돌려 각 'master' 엔티티의 속성 값을 바꾼 후 Update()하는 작업인데, Update()에서 해당 오류가 발생했다.
// master 라는 Entity를 조회하는 소스가 위에 있다고 가정한다. master.step = 3; master.doneCnt = dbContext.result.Where(e => e.idx == master.idx).Count(); dbContext.Update(master);
대충 번역하면 동일한 PK를 가진 인스턴스를 이미 tracking 하고 있는데, 왜 또 찾아서 Update() 하냐는 오류이다. 해결방법은 원인이 되는 위치의 인스턴스를 Entry().State 를 EntityState.Detached로 바꿔주면 된다고 하지만, 다른 문제가 발생할 수 있어 아래 방법 중 한가지로 대체했다.
1. 원인이 되는 위치에 dbContext를 새로 생성
원인이 되는 위치가 별도의 함수이고, 파라메터로 dbContext 를 받아서 사용하는 구조이다. 파라메터가 아닌 아예 함수 내에서 dbContexte 객체를 새로 만들면 해결되긴 한다.
그러나 불필요하게 리소스를 낭비하는 것 같아 이 방법은 사용하지 않았다.
2. Entity를 검색하여 해당 객체를 이용
tracking 하고 있는 객체가 이미 존재한다고하니, 해당 객체를 가져오면 된다.
소스코드를 아래와 같이 수정한다.
// master 라는 Entity를 조회하는 소스가 위에 있다고 가정한다. var m = dbContext.Find<masterTbl>(master.idx, master.seq); m.step = 3; m.doneCnt = dbContext.result.Where(e => e.idx == master.seq).Count(); dbContext.Update(m);
dbContext에서 Find 함수를 통해 추적되는 객체를 m 변수에 대입시켰다. 그리고 해당 변수를 조작해 원하는 Update를 수행했다.
반응형'.NET > 개념 및 유용한 팁' 카테고리의 다른 글