2010-04-23 4 views
1

복합 키를 만들었지 만 작동하고 있지만 행 클래스에서 별도의 직접 필드를 사용하고 싶습니다.NHibernate Composite Key

private UserPrimaryKey _compositeKey; 
    public virtual UserPrimaryKey CompositeKey 
    { 
     get 
     { 
      if (_compositeKey == null) _compositeKey = new UserPrimaryKey(); 
      return _compositeKey; 
     } 
     set { 
      if (_compositeKey == value) return; 
      _compositeKey = value; 
      Host = value.Host; 
      UserAccount = value.User; 
     } 
    } 
    public string Host { get; set; } 
    public string UserAccount { get; set; } 

그리고이 일을 더 나은 방법이 있는지 궁금 해서요 :이 일을 해요

현재의 방법은 다음과 같다? NHibernate 설정 파일에있을 수 있습니다.

나의 현재 설정 파일은 때라도입니다 :

<class name="TGS.MySQL.DataBaseObjects.DataBasePrivilege,TGS.MySQL.DataBaseObjects" table="user"> 
<composite-id name="CompositeKey" class="TGS.MySQL.DataBaseObjects.UserPrimaryKey, TGS.MySQL.DataBaseObjects"> 
    <key-property name="Host" column="Host" type="string" length="60" /> 
    <key-property name="User" column="User" type="string" length="16" /> 
</composite-id> 
</class> 

답변

2

당신은 ... 당신의 클래스에서 직접 속성을 만들고 그들을 매핑 할 수 있습니다) 읽을 수 xml로 유지 수업 시간에.

+0

실제로 작동합니다 : O –

+1

물론입니다! 나는 너에게 거짓말하지 않을 것이다 .-D –

+0

고마워! : D 효과 –

1

나는 다음과 같은 제안 :

private UserPrimaryKey _compositeKey; 
    public virtual UserPrimaryKey CompositeKey 
    { 
     get 
     { 
      if (_compositeKey == null) _compositeKey = new UserPrimaryKey(); 
      return _compositeKey; 
     } 
     set { 
      if (_compositeKey == value) return; 
      _compositeKey = value; 
      Host = value.Host; 
      UserAccount = value.User; 
     } 
    } 
    public string Host 
    { 
     get 
     { 
      return CompositeKey.Host; 
     } 
     set 
     { 
      CompositeKey.Host = value; 
     } 
    } 
    public string UserAccount 
    { 
     get 
     { 
      return CompositeKey.User; 
     } 
     set 
     { 
      CompositeKey.User = value; 
     } 
    } 

중복 데이터를 해달라고이 방법 만 반환/복합 키 내부의 데이터를 설정합니다.

1

가능한 경우 복합 키를 피할 수 있습니다. 모두 열을 정기적 고유 제한 조건으로 교체 :

<class name="DataBasePrivilege" table="user"> 
    <id name="id"> 
    <generator class="hilo"> 
     <param name="table">user_HiLo</param> 
     <param name="max_lo">100</param> 
    </generator> 
    </id> 
    <property name="Host" length="60" unique-key="user_host"/> 
    <property name="User" length="16" unique-key="user_host"/> 
</class> 

(그런데 : 당신이 일반적인 경우의 유형을 지정할 필요가 없습니다, 당신은 그들이 속성과 일치하는 경우 열 이름을 지정할 필요가 없습니다 . 당신이 그렇게한다면

<composite-id> 
    <key-property name="Host"/> 
    <key-property name="UserAccount"/> 
</composite-id> 

것은, 당신이 EqualsGetHashCode를 재정의해야합니다 : 이름이 당신이

+0

테이블은 MySQL 기본 테이블 (MySQL 데이터베이스 사용자 기록 보관에 사용됨)이므로 스키마를 변경할 수 없습니다. 이 여전히 스키마를 변경하지 않고 작동합니까? –

관련 문제