.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 ()을 사용하는 것이 좋습니다. 이 시나리오에서는 엔터티를 다시 가져 오지만 상황에 따라 추적하지 않으므로 메모리 사용을 최소화하고 최적의 성능을 보장합니다.
찬성
- 일반 LINQ 쿼리보다 성능이 향상되었습니다.
- 완전히 구체화 된 객체.
- 프로그래밍 언어에 내장 된 구문으로 작성하는 것이 가장 간단합니다.
단점
- CUD 작업에는 적합하지 않습니다.
- OUTER JOIN 쿼리에 DefaultIfEmpty를 사용하는 패턴은 Entity SQL의 간단한 OUTER JOIN 문보다 복잡한 쿼리를 생성합니다.
- 여전히 일반 패턴 일치와 함께 LIKE를 사용할 수 없습니다.
더 많은 정보는 여기에 있습니다 :
추적을 비활성화하면 결과 집합이 메모리로 스트리밍됩니다. 대량의 데이터 세트로 작업 할 때 전체 데이터 세트를 한 번에 모두 필요로하지 않을 때 더 효율적입니다.
참고 문헌 :
- Entity Framework 및 LINQ를 사용하여 대용량 데이터 세트를 쿼리 할 때 메모리 오버 플로우를 피하는 방법
- Entity framework large data set, out of memory exception
AsNoTracking() allows the "unique key per record" requirement in EF to be bypassed (not mentioned explicitly by other answers).
This is extremely helpful when reading a View that does not support a unique key because perhaps some fields are nullable or the nature of the view is not logically indexable.
For these cases the "key" can be set to any non-nullable column but then AsNoTracking() must be used with every query else records (duplicate by key) will be skipped.
If you have something else altering the DB (say another process) and need to ensure you see these changes, use AsNoTracking()
, otherwise EF may give you the last copy that your context had instead, hence it being good to usually use a new context every query:
http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/
참고URL : https://stackoverflow.com/questions/12211680/what-difference-does-asnotracking-make
'Programing' 카테고리의 다른 글
메모리 주소가 아닌 경우 C 포인터는 정확히 무엇입니까? (0) | 2020.05.06 |
---|---|
Windows의 명령 행에서 Java 프로그램을 어떻게 실행합니까? (0) | 2020.05.06 |
OpenGL에서 프리미티브를 와이어 프레임으로 어떻게 렌더링합니까? (0) | 2020.05.06 |
JavaScript 변수는 외부 또는 내부 루프를 선언합니까? (0) | 2020.05.06 |
Windows 용 명령 줄 svn? (0) | 2020.05.06 |