.AsNoTracking ()의 차이점은 무엇입니까?


228

.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 단계는 업데이트이므로 어쨌든 두 데이터베이스에 두 번 충돌 할 것으로 예상됩니다.

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

답변:


187

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


1
context.Users.Select (u => new {Name = u.Name})과 같은 선택 쿼리에서 익명 클래스에 대해 동일한 이점을 얻을 수 있습니까? 감사.
Dilhan Jayathilake

6
@DilhanJayathilake : 익명 클래스는 엔티티 자체를 나타내지 않으므로 추적이 없습니다.
Ladislav Mrnka

1
EF6이 View에서 엔터티 키를 잘못 추론하기 때문에 때때로 AsNoTracking ()은 키를 무시하므로 키를 수동으로 수정하는 대신 사용할 수 있습니다 (키의 다른 이점이 필요하지 않다고 가정).
crokusek

4
또한 AsNoTracking의 가장 큰 효과는 게으른 로딩이 작동하지 않는다는 것입니다
Douglas Gaskell

170

이 페이지 참조 Entity Framework 및 AsNoTracking

AsNoTracking의 기능

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

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


11
때때로 이득이 균형
Fabrice

3
한 단계에 포함 된 상위 하위 관계를로드하는 복잡한 쿼리로 인한 성능 향상은 약 50 %였습니다.
Karl

53

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

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

찬성

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

단점

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

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

Entity Framework의 성능 고려 사항

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



10

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

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

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


2
Views로 이것의 중요성을 반복하기 위해 SSMS를 통해 실행될 때 7 개의 고유 레코드를 반환하는보기의 쿼리가 있습니다. AsNoTracking 수정자를 사용하지 않고 EF를 통해 실행하면 첫 번째 레코드, 두 번째 사본 세 개 및 세 번째 사본 세 개를 얻습니다. 이 문제를 해결하기 위해 엄청나게 많은 헤드 스크래칭이 필요했으며 AsNoTracking을 사용하여 문제를 해결했습니다!
에이드

기본 키가없는보기를 쿼리하는 동안 Linq를 엔티티에 사용할 때 이와 동일한 문제가 발생했습니다. 반나절 동안 머리를 긁은 후 AsNoTracking에 대해서만 알게되었습니다. 이 ASP.Net 포럼 게시물은 결국 나를 이끌어 냈습니다. forums.asp.net/t/…
red_dorian

6

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.