2009-06-10 4 views
0

내 도메인 구동 디자인에서 필자는 포함 엔티티, 예를 들어 구성 엔티티의 목록이있는 자동차를 가지고 있습니다. 바퀴.엔티티 및 NHibernate 지속성을 포함하는 도메인 기반 디자인

이제 자동차 엔티티에 ChangeWheel 메서드를 추가하고 싶습니다. 바퀴를 변경한다고해서 실제로 자동차 엔티티가 변경되는 것은 아닙니다. 휠 콜렉션에있는 엔테이트 중 하나에만 영향을 미칩니다. 나는. Car 엔터티에는 IList 특성이 있습니다. 내 데이터베이스 스키마에서 나는 바퀴에 대한 참조가없는 자동차 엔티티가있다. 오히려 바퀴 테이블에는 CarId의 외래 키가있다.

자동차의 휠을 변경하면 특정 휠 레코드가 업데이트됩니다. 업데이트하려는 유일한 테이블은 데이터베이스의 버전 감사 테이블입니다.

내가 NHibernate를 통해 저장소에서 Car 엔티티를 추출하고 ChangeWheel (...)을 호출 한 다음 다시 저장하면 NHibernate가 자동차 레코드의 새 버전을 저장하지 않도록 구성 할 수 있습니까?

이 모든 것이 의미가 있기를 바랍니다. 그렇지 않은 경우 사전에 질문 해주세요.

+0

좋은 ORM은 레코드의 데이터가 실제로 변경되었을 때만 데이터를 데이터베이스 테이블에 저장해야한다. –

답변

1

NHibernate는 Iesi.Collections.Generic.ISet에서 파생 된 자체 컬렉션과 함께 모음 (예 : Wheels)과 같은 속성을 마무리합니다. 이 작업이 완료되면 컬렉션에 대한 변경 사항을 추적 할 수 있으며 이는 물론 필요한 업데이트 만 실행한다는 것을 의미합니다.

이 경우 Wheel에 Equals 및 GetHashCode를 구현해야합니다. 여기 같음과 GetHashCode를 구현하는 방법에 대한 블로그 포스트는 다음과 같습니다

Implemeting Equals and GetHashCode

1

NHibernate에 자연적으로이 작업을 수행 할 것입니다. 기존 매핑이 있습니까? 아니면 그냥 가상입니까? NHibernate docs에서

+0

이 시점에서 가상의 무엇인가. 내가 NHibernate를 고려하고있는 새로운 프로젝트. – ng5000

1

은 :

  • 우리가 컬렉션에/ 에서 개체를 추가/제거

    , 콜렉션 소유자의 버전 번호가 증가된다.

그러나 ... 당신은 새로 Wheel 추가했지만 하지Car 자체 유지를 지속 시도 할 수 있습니다. 이것은 원하는 효과를 주어야하지만, NHibernate는 항상 더러운 것으로 간주한다. (ISession 관리를 보아라.)

+0

고마워요 - nhibernate로 작업 할 때 모든 엔티티 (둘 다/비즈니스 개체와 DB 테이블)에 버전 번호 열/필드가 있어야합니까? – ng5000

+0

번호 버전 번호는 낙관적 잠금에 사용됩니다. –

관련 문제