다음을 통해 공유


변경 내용 자동 검색

대부분의 POCO 엔터티를 사용하는 경우 엔터티가 변경된 방식과 이에 따라 데이터베이스에 보내야 하는 업데이트를 판단하는 것은 변경 내용 검색 알고리즘으로 처리됩니다. 변경 내용 검색은 엔터티의 현재 속성 값과 엔터티가 쿼리되거나 연결되었을 때 스냅샷에 저장된 원래 속성 값 간의 차이를 검색하여 작동합니다. 이 토픽에서 설명하는 방법은 Code First 및 EF 디자이너를 사용하여 만든 모델에 동일하게 적용됩니다.

기본적으로 Entity Framework는 다음 메서드가 호출되면 변경 내용 검색을 자동으로 수행합니다.

  • DbSet.Find
  • DbSet.Local
  • DbSet.Add
  • DbSet.AddRange
  • DbSet.Remove
  • DbSet.RemoveRange
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

변경 내용 자동 검색을 사용하지 않도록 설정

컨텍스트에서 많은 엔터티를 추적하고 루프에서 이러한 메서드 중 하나를 여러 번 호출하는 경우 루프 기간 동안 변경 내용 검색을 해제하여 성능을 크게 개선할 수 있습니다. 예시:

using (var context = new BloggingContext())
{
    try
    {
        context.Configuration.AutoDetectChangesEnabled = false;

        // Make many calls in a loop
        foreach (var blog in aLotOfBlogs)
        {
            context.Blogs.Add(blog);
        }
    }
    finally
    {
        context.Configuration.AutoDetectChangesEnabled = true;
    }
}

루프 후 변경 내용 검색을 다시 활성화해야 합니다. 루프의 코드에서 예외를 throw하더라도 항상 다시 활성화되도록 try/finally를 사용했습니다.

비활성화한 후 다시 활성화하는 대신 변경 내용의 자동 검색을 항상 해제하고 context.ChangeTracker.DetectChanges를 명시적으로 호출하거나 변경 내용 추적 프록시를 부지런히 사용할 수도 있습니다. 이러한 두 옵션은 모두 고급이며 애플리케이션에 미묘한 버그가 생기기 쉬우므로 주의해서 사용하세요.

컨텍스트에서 많은 개체를 추가하거나 제거해야 하는 경우 DbSet.AddRange 및 DbSet.RemoveRange를 사용하는 것이 좋습니다. 이 메서드는 추가 또는 제거 작업이 완료된 후 변경 내용을 한 번만 자동 검색합니다.