2010-04-23 116 views
1

我已經創建了一個組合鍵,它正在工作,但理想情況下,我希望行類中單獨的直接字段。NHibernate複合鍵

我這樣做目前的方法如下:

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配置文件中。

我現在的配置文件是follwoing:

<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

您可以在類中直接創建的屬性...,並與它們映射:

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

如果你這樣做,你就必須重寫EqualsGetHashCode在你的班級。

+0

實際工作:O – 2010-04-24 20:49:18

+1

當然它!我不會騙你:-D – 2010-04-25 00:11:15

+0

謝謝! :D它工作 – 2010-04-26 08:10:43

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> 

(順便說一句:你不需要指定在通常情況下類型和你不需要,如果他們匹配屬性指定的列名。名字這樣可以使你xml的讀取)

+0

不幸的是,該表是MySQL本地表(用於保存MySQL數據庫用戶的記錄),所以我無法更改該模式。這仍然可以在不改變模式的情況下運行 – 2010-04-23 16:00:44