2011-04-18 2 views
9

NHibernate를 사용할 때, 고유 제한 조건을 갖고 그 제한 조건에 의해 고유하게 식별 될 수있는 엔티티가있는 경우, 제한 조건을 복합 키로 나타내거나 별도의 ID 복합 고유 제한이 있습니까? 나는 그것이 도움이 될 수 있고 레거시 데이터베이스로 작업 할 때만 사용되어야한다면 NHibernate와 복합 키를 사용하는 것이 "나쁜"것으로 간주된다는 것을 읽었습니다.NHibernate Composite Key와 Composite Unique Constraint

이미지 설정이 다음과 같이 여기

class Book 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Author { get; set; } 
    public virtual IList<BookEdition> Editions { get; set; } //HasMany (one to many) 
} 

class BookEdition 
{ 
    public virtual string Title { get; set; } 
    public virtual string Language { get; set; } 
    public virtual int Edition { get; set; } 
} 

우리가 언어 및 버전에 제약이있는 BookEdition의 제한을, 즉 같은에서 책의 두 가지 버전이있을 수 없습니다 언어. 모든 판은 판 번호와 언어로 고유하게 식별 될 수 있습니다.

어떤 접근 방식이 NHibernate에서 더 좋은 것으로 간주됩니까? Language/Edition을 복합 Id로 사용하거나 BookEdition에 대한 Id 변수를 도입하고 복합 고유 제한 조건을 대신 사용 하시겠습니까?

답변

9

일반적으로 NHibernate뿐만 아니라 Surrorgate 키 (추가 ID 변수)가 더 좋습니다. 자연 키 (여기서 : 언어 및 버전)의 문제점은 "비즈니스"라는 의미입니다. 비즈니스 요구 사항은 시간이 지남에 따라 진화하고 앞으로는 자연 키를 변경해야하므로 매우 고통 스러울 수 있습니다. 또한 SQL 조인 및 조건이 더 복잡해집니다.

복합 고유 제한 조건으로 BookEdition의 FNH 매핑 될 수있다 : Btw는

Id(x => x.Id); 
    Map(x => x.Title); 
    Map(x => x.Language).UniqueKey("MyCompositeUniqueConstraint"); 
    Map(x => x.Edition).UniqueKey("MyCompositeUniqueConstraint"); 

. 고객에게 중요한 키 값을 표시하지 않는 것이 좋습니다. 그들은 그들에게 약간의 비즈니스 의미를 부여하는 경향이 있습니다.

+0

이것은 내가 생각하고있는 매핑입니다. Natural 키를 사용하려면 Equals/GetHashCode를 재정의하는 것이 좋습니다. 내 기본 클래스에서 Id 속성에서 작동하는 Equals 연산자가 있지만이 경우에는 정확하지 않습니다. "NaturalId()"를 사용하여 복합 자연 키를 사용할 수도 없습니다. 최대 절전 모드에서 자연 id와 고유 제한 사이의 차이에 대해 명확하지 않습니다. –

+0

IMO 고유 제한 조건 (또는 키)이 NH 내부에서 아무런 역할을하지 않습니다. 그것은 단지 DB를 만드는 방법을 안내합니다. 스키마 (테이블에 제약 조건 생성). 반면에 기본 키 (복합, 자연, survergate는 중요하지 않음)는 OR 매핑의 기본 개념입니다. 데이터베이스 테이블에서 엔티티를 고유하게 찾는 방법을 알려줍니다. –

+0

흠, 특히 항상 지연로드 및 프록시가 관련되어있을 때 Equals와 결과적으로 GetHashCode를 재정의하는 것이 좋습니다 (http://devlicio.us/blogs/billy_mccafferty/archive/2007/04/25/using-equals- gethashcode-effective.aspx). 매우 재미있는, 당신의 질문에 대한 감사, 그것은 아직 NH에 대해 아무것도 몰라 :). –

관련 문제