2009-04-09 6 views
3

필드가 변경되었는지 확인해야하는 호출이 있습니다. 그러나 해당 엔티티 ID를 사용하여 호출하면 이전 버전이 아닌 동일한 엔티티를 반환합니다.엔티티 필드가 NHibernate에서 변경되었는지 확인

Entity e = Dao.Get(id); 
//At this point e.Field is X 
e.Field = y; 
Dao.Save(e); 

Entity Dao.Get(Guid id) 
{ 
    return Session.Get(id); 
} 

Entity Dao.Save(Entity e) 
{ 
    Entity olde = Session.Get(e.Id); 
    if (e.Field != olde.Field) <--- e.Field == olde.Field so it does not run. 
    DoBigMethod(e); 
    return e; 
} 

은 어떻게 Entity 클래스에의 onChange 방법을 추가하지 않고이 상황을 처리 않습니다.

답변

1

엔티티의 "버전"하나만 알면됩니다. 현재 버전입니다. 은 실제로는 하나의 엔터티 버전 인입니다. 당신은 그것을 기억하고 있으며 이미 그것을 바꿨고 이전 상태를 잊어 버렸습니다.

전화를 걸어 이전 데이터베이스 상태를 확인하는 것은 위험합니다. 변경 사항이 이미 플러시 된 경우 (예를 들어 NHibernate가 쿼리 전에 플러시) 변경 사항이 적용됩니다. 다른 세션을 열면 다른 트랜잭션의 변경 사항이 표시됩니다.

하나의 필드에만 관심이 있으십니까? 그런 다음 이전 값을 어딘가에 캐시 할 수 있습니다.

이 방법을 사용할 수없는 경우이 필드의 이전 값을 알아야하는 이유에 대해 자세히 알려야합니다.

편집 :

좀 더 아이디어 :

  • 캐시
  • 가 그것을 경우 플래그를 설정,이 속성을 구현 DAO.Get에서 개체를 얻을 필드의 이전 상태, 변경되었습니다.
  • 플래그가 변경 될 때 호출되는 암시 적 조작 대신이 변경을 클라이언트가 호출 한 명시 적 조작으로 만드는 것을 고려하십시오. 예를 들어,이 플래그가 "활성화 됨"이라면 "활성화"및 "비활성화"메소드를 구현하십시오. 이 메소드는 해당 플래그를 변경하고 "큰 코드 세트"를 수행합니다. 플래그는 나머지 세계에 대해 읽기 전용입니다.
+0

사용자가 변경되면 많은 코드가 실행된다는 플래그가 있습니다. 이 코드는 특정 경우에 예외를 발생시킵니다. 다른 필드를 업데이트하는 중이라면이 확인 작업을 수행 할 필요가 없습니다. 이 경우에는 예외가 발생하지 않을 것입니다. – Thad

+0

나는 내 대답에 더 많은 아이디어를 추가했다. 희망이 도움이됩니다. –

관련 문제