내 응용 프로그램은 Entity Framework 6.1.0 및 DbContext
API를 사용합니다.DbContext.ChangeTracker.HasChanges가 매우 느립니다.
그것은 일종의 CAD 시스템이며 일부 엔지니어링 문서를 편집하기위한 것입니다. 문서의 변경 사실을 확인하려면 DbContext.ChangeTracker.HasChanges
을 사용하고 있습니다.
문서에 많은 양의 데이터 (약 20-25,000 개의 항목)가있는 경우 DbContext.ChangeTracker.HasChanges
은 매우 느림입니다. 이 코드는 "저장"명령을 활성화/비활성화하는 데 사용되므로 UI 스레드에서 자주 실행됩니다. 이는 애플리케이션 성능에 영향을 미친다.
private Lazy<DbContext> context;
public bool HasChanges
{
get
{
if (!context.IsValueCreated)
{
return false;
}
return context.Value.ChangeTracker.HasChanges();
}
}
일이에 :
public bool HasChanges
{
get
{
if (!context.IsValueCreated)
{
return false;
}
var objectStateManager = ((IObjectContextAdapter)context.Value).ObjectContext.ObjectStateManager;
return
objectStateManager.GetObjectStateEntries(EntityState.Added).Any() ||
objectStateManager.GetObjectStateEntries(EntityState.Deleted).Any() ||
objectStateManager.GetObjectStateEntries(EntityState.Modified).Any();
}
}
을하고 (이것은 기적이다!) 모든 것이 매우 빠르게 작동
이 나는이 조각을 다시 작성했습니다.
DbChangeTracker.HasChanges
처럼 보이는 것은 최적이 아닙니다. 내가 빠진 것이 있습니까?
질문의 코드는 추가 호출과 관련이 없습니다. DetectChanges를 한 번 호출하면 많은 수의 엔티티에서 느려지지만 O (N^2)는 아닙니다. –