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 변수를 도입하고 복합 고유 제한 조건을 대신 사용 하시겠습니까?
이것은 내가 생각하고있는 매핑입니다. Natural 키를 사용하려면 Equals/GetHashCode를 재정의하는 것이 좋습니다. 내 기본 클래스에서 Id 속성에서 작동하는 Equals 연산자가 있지만이 경우에는 정확하지 않습니다. "NaturalId()"를 사용하여 복합 자연 키를 사용할 수도 없습니다. 최대 절전 모드에서 자연 id와 고유 제한 사이의 차이에 대해 명확하지 않습니다. –
IMO 고유 제한 조건 (또는 키)이 NH 내부에서 아무런 역할을하지 않습니다. 그것은 단지 DB를 만드는 방법을 안내합니다. 스키마 (테이블에 제약 조건 생성). 반면에 기본 키 (복합, 자연, survergate는 중요하지 않음)는 OR 매핑의 기본 개념입니다. 데이터베이스 테이블에서 엔티티를 고유하게 찾는 방법을 알려줍니다. –
흠, 특히 항상 지연로드 및 프록시가 관련되어있을 때 Equals와 결과적으로 GetHashCode를 재정의하는 것이 좋습니다 (http://devlicio.us/blogs/billy_mccafferty/archive/2007/04/25/using-equals- gethashcode-effective.aspx). 매우 재미있는, 당신의 질문에 대한 감사, 그것은 아직 NH에 대해 아무것도 몰라 :). –