2010-05-28 2 views
10

nhibernate 프록시는 변경 사항 추적을 효율적으로 수행하기 위해 스마트 작업을 수행합니까? 또는 Entity Framework에서 스냅 숏 기반 변경 추적을 호출하는 것만 지원합니까?NHibernate는 변경 추적을 어떻게 구현합니까?

+0

감사 로깅, 변경 사항이 기록되는 항목 또는 이전 버전의 항목으로 되돌릴 수있는 전체 변경 관리에 대해 이야기하고 있습니까? – DanK

+0

엔터티에 여러 속성이있는 경우 ORM은 속성 만 변경된 데이터베이스에 업데이트 문을 실행해야합니다. LINQ TO SQL에서는 INotifyPorpertyChanging/Changed 인터페이스를 통해 속성이 변경되었는지 여부를 알 수 있습니다 (요구 사항은 아니지만 스냅 샷 기반 변경 추적으로 되돌아갑니다. 즉 모든 속성을 비교하여 변경된 속성을 찾습니다).). – Alice

답변

12

스냅 샷 기반입니다.

엔티티를로드 할 때 상태가 객체 []로 세션에 저장됩니다.

플러시 할 때 현재 상태가 개체 []로 변환되고 원래 상태와 비교되어 더러운 속성을 확인합니다.

이는 여러 가지 이유로 더 효율적입니다. 그 중 하나는 프록시가 변경 사항을 추적 할 필요가 없다는 것입니다. 또 다른 속성은 속성을 다른 값으로 설정 한 다음 되돌리면 엔티티가 더티가 아닌 것으로 간주되어 불필요한 DB 호출을 피할 수 있다는 것입니다.

9

NHibernate 및 EntityFramework 트랙은 매우 다른 방식으로 변경됩니다. Entity Framework는 엔터티 자체의 변경 내용을 추적합니다. NHibernate는 세션의 변경을 추적합니다.

엔티티의 변경 내용을 추적하려면 이전 값과 이후 값을 저장하므로 더 많은 메모리가 필요합니다. 개체는 ObjectContext와의 연결을 끊은 후에도 변경 내용 추적을 유지할 수 있습니다.

세션의 변경 내용을 전체적으로 추적하는 것이 더 효율적이지만 세션에서 엔터티의 연결을 끊으면 변경 내용 추적이 손실됩니다.

+0

이 문구가 맞습니까? 내가 아는 한, EF는 소위 변경 추적기를 사용하여 엔티티 변경 사항을 추적합니다. 변경 추적 인프라는 해당 엔터티에 포함되어 있지 않습니다. – Andreas

관련 문제