2012-03-15 6 views
2

ID가 포함 된 3 개의 열이있는 테이블이있는 상황이 있습니다. 이 3 열 이외에 몇 가지 속성이있는 몇 개의 열이 있습니다.NHibernate에서 null 값을 포함하는 합성 ID

3 개의 열이 Foo, Bar, Baz라고 가정 해 봅시다. Foo는 null이 아니며 Bar, Baz 중 하나가 null입니다.

내 기업 및 매핑 (나는 간단한 일을 계속하고 싶어 염두에 두시기 바랍니다) 다음과 같습니다

public class FooBarBaz 
{ 
    public virtual Foo Foo { get; set; } 
    public virtual Bar Bar { get; set; } 
    public virtual Baz Baz { get; set; } 
    public virtual string Prop { get; set; } 

    public override bool Equals(Object obj) 
    { 
     /* checks for nulls etc. in the end 
     returns Foo == obj.Foo && Bar == obj.Bar && Baz == obj.Baz */ 
    } 

    public override int GetHashCode() 
    { 
     /* builds unique string for (Foo,Bar,Baz) 
     taking nulls into account and gets it's hashcode */ 
    } 
} 

public class FooBarBazMap : ClassMap<FooBarBaz> 
{ 
    public FooBarBazMap() 
    { 
     CompositeId() 
      .KeyReference(x => x.Foo, "Foo_Id") 
      .KeyReference(x => x.Bar, "Bar_Id") 
      .KeyReference(x => x.Baz, "Baz_Id"); 
     Map(x => x.Prop); 
    } 
} 

내가 수동으로 모든 세 개의 열이 null이 아닌 행을 생성하고,이 매핑은 완전히 작동 벌금. 하지만 내 응용 프로그램 로직은 항상 두 개 (Bar, Baz) 중 하나가 null이라는 사실을 기반으로하며,이 상황에서 NHibernate는 FooBarBaz 엔터티로 null을 반환합니다.

이 문제를 어떻게 극복 할 수 있습니까? NHibernate는 CompositeId에서 null 값을 허용합니까?

답변

2

nhibernate는 관계형 데이터베이스의 추상화이며 관계형 데이터베이스는 기본 키 열에 null 값을 허용하지 않습니다. 실제로 모든 pk 열에는 null 제약 조건이 없습니다.

이 테이블이 3 개의 엔티티 사이의 링크 테이블이라고 가정하면 구성 요소로 매핑됩니다. Foo bar와 baz 사이에 연관 관계를 게시하면 예제를 줄 수 있습니다.

+0

나는이 열이 기본 키라고 말하지 않았다. – szymzet

+3

하지만 compositeid로 매핑하면 nh는 그렇게 생각하고 db와 동일하게 동작합니다. 그래서 당신의 질문에 답하십시오 : 아니오. – Firo

관련 문제