[C#] .AsNoTracking ()의 차이점은 무엇입니까?

.AsNoTracking()확장 프로그램 에 관한 질문 이 있습니다. 이것은 모두 새롭고 혼란 스럽습니다.

웹 사이트에 요청 당 컨텍스트를 사용하고 있습니다.

많은 엔터티가 변경되지 않으므로 추적 할 필요는 없지만 데이터베이스에 어떤 일이 발생하는지 확실하지 않거나이 경우에 차이가 있는지 여부는 확실하지 않은 다음 시나리오가 있습니다.

이 예는 내가 현재하고있는 일입니다.

context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user

이것은 위와 동일하지만 .AsNoTracking()1 단계에서를 제거합니다 .

context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user

1 단계와 2 단계는 동일한 컨텍스트를 사용하지만 다른 시간에 발생합니다. 내가 해결할 수없는 것은 차이점이 있는지 여부입니다. 2 단계는 업데이트이므로 어쨌든 두 데이터베이스에 두 번 충돌 할 것으로 예상됩니다.

아무도 차이점이 무엇인지 말해 줄 수 있습니까?



답변

차이점은 첫 번째 경우 검색된 사용자가 컨텍스트에 의해 추적되지 않으므로 사용자를 데이터베이스에 다시 저장하려는 경우 사용자를 연결하고 사용자의 올바른 상태를 설정하여 EF가 기존 사용자를 업데이트해야 함을 알고 있다는 것입니다 새 것을 삽입하는 대신. 두 번째 경우에는 추적 메커니즘이 자동으로 처리하므로 동일한 컨텍스트 인스턴스로 사용자를로드하고 저장하는 경우에는 그렇게 할 필요가 없습니다.


답변

이 페이지 참조 Entity Framework 및 AsNoTracking

AsNoTracking의 기능

Entity Framework는 응용 프로그램의 성능을 최적화하는 데 도움이되는 여러 가지 성능 조정 옵션을 제공합니다. 이러한 튜닝 옵션 중 하나는 .AsNoTracking()입니다. 이 최적화를 통해 Entity Framework쿼리 결과를 추적하지 않도록 지시 할 수 있습니다 . 이는 Entity Framework쿼리에 의해 리턴 된 엔티티의 추가 처리 또는 저장 을 수행하지 않음을 의미 합니다. 그러나 추적 엔터티에 다시 연결하지 않으면 이러한 엔터티를 업데이트 할 수 없습니다.

AsNoTracking을 사용하면 성능이 크게 향상됩니다


답변

엔티티에 대한 LINQ 추적 쿼리 없음

쿼리가 읽기 작업을위한 경우 AsNoTracking ()을 사용하는 것이 좋습니다. 이 시나리오에서는 엔터티를 다시 가져 오지만 상황에 따라 추적하지 않으므로 메모리 사용을 최소화하고 최적의 성능을 보장합니다.

찬성

  1. 일반 LINQ 쿼리보다 성능이 향상되었습니다.
  2. 완전히 구체화 된 객체.
  3. 프로그래밍 언어에 내장 된 구문으로 작성하는 것이 가장 간단합니다.

단점

  1. CUD 작업에는 적합하지 않습니다.
  2. OUTER JOIN 쿼리에 DefaultIfEmpty를 사용하는 패턴은 Entity SQL의 간단한 OUTER JOIN 문보다 더 복잡한 쿼리를 생성합니다.
  3. 여전히 일반 패턴 일치와 함께 LIKE를 사용할 수 없습니다.

더 많은 정보는 여기에 있습니다 :

Entity Framework의 성능 고려 사항

엔터티 프레임 워크 및 추적 없음


답변

추적을 비활성화하면 결과 집합이 메모리로 스트리밍됩니다. 대규모 데이터 세트로 작업 할 때 전체 데이터 세트를 한 번에 모두 필요로하지 않을 때 더 효율적입니다.

참고 문헌 :


답변

AsNoTracking ()을 사용하면 EF의 “레코드 당 고유 키”요구 사항을 무시할 수 있습니다 (다른 답변에서 명시 적으로 언급하지 않음).

이는 일부 필드가 널 입력 가능하거나보기의 특성이 논리적으로 색인 작성 가능하지 않기 때문에 고유 키를 지원하지 않는보기를 읽을 때 매우 유용합니다.

이 경우 “키”는 널이 아닌 열로 설정할 수 있지만 모든 쿼리에 AsNoTracking ()을 사용해야합니다. 그렇지 않으면 레코드 (키에 의해 중복 됨)는 건너 뜁니다.


답변

다른 프로세스와 같이 DB를 변경하는 다른 것이 있고 이러한 변경 사항을 확인 해야하는 AsNoTracking()경우을 사용하십시오 . 그렇지 않으면 EF가 컨텍스트가 마지막으로 복사 한 사본을 줄 수 있으므로 일반적으로 모든 쿼리마다 새로운 컨텍스트를 사용하는 것이 좋습니다 :

http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/


답변