programing

차이가 무엇을 합니까?추적()이 수행하지 않는 대로?

golfzon 2023. 6. 3. 13:15
반응형

차이가 무엇을 합니까?추적()이 수행하지 않는 대로?

저는 그것과 관련하여 질문이 있습니다..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

추적 기능이 없는 기능

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를 사용할 수 없습니다.

자세한 내용은 여기에서 확인할 수 있습니다.

엔티티 프레임워크에 대한 성능 고려사항

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

추적을 비활성화하면 결과 집합이 메모리로 스트리밍됩니다.이는 대용량 데이터 세트를 사용하는 경우 전체 데이터 세트가 동시에 필요하지 않을 때 더욱 효율적입니다.

참조:

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

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

이러한 경우 "key"를 null이 아닌 열로 설정할 수 있지만 AsNoTracking()을 모든 쿼리에 사용해야 합니다. 그렇지 않으면 레코드(키별 복제)를 건너뜁니다.

경우(프로세스를 ) 변경사항을 해야 할 DB를 하십시오.AsNoTracking()그렇지 않으면 EF가 컨텍스트가 가진 마지막 복사본을 대신 제공할 수 있으므로 쿼리할 때마다 일반적으로 새 컨텍스트를 사용하는 것이 좋습니다.

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

언급URL : https://stackoverflow.com/questions/12211680/what-difference-does-asnotracking-make

반응형