2012-07-10 123 views
0

在NHibernate中,我定義了一個類及其映射。我不確定複合鍵定義和equals/GetHashCode是否正確?NHibernate複合鍵問題

[DataMember] 
public virtual int EXCEPTION_ID { get; set; } 

[DataMember] 
public virtual int RUNID { get; set; } 

[DataMember] 
public virtual int ROW_ID { get; set; } 

[DataMember] 
public virtual string FIELD_NAME { get; set; } 

[DataMember] 
public virtual string FIELD_VALUE { get; set; } 

public override bool Equals(object obj) 
{ 
    if (obj == null) 
    { 
     return false; 
    } 

    var t = obj as ExceptionFld; 

    if ((EXCEPTION_ID == t.EXCEPTION_ID) && (RUNID == t.RUNID) && (ROW_ID == t.ROW_ID) && (FIELD_NAME == t.FIELD_NAME)) 
    { 
     return true; 
    }  

    return false; 
}   

public override int GetHashCode() 
{ 
    return (EXCEPTION_ID + "|" + RUNID + "|" + ROW_ID + "|" + FIELD_NAME).GetHashCode(); 
} 

映射文件是

<composite-id> 
     <key-property name="EXCEPTION_ID"/> 
     <key-property name="RUNID"/> 
     <key-property name="ROW_ID"/> 
     <key-property name="FIELD_NAME"/> 
    </composite-id> 

    <property name="EXCEPTION_ID" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" not-null="true"> 
     <column name="EXCEPTION_ID" /> 
    </property> 

    <property name="RUNID" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" not-null="true"> 
     <column name="RUNID" /> 
    </property> 

    <property name="ROW_ID" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" not-null="true"> 
     <column name="ROW_ID" /> 
    </property> 

    <property name="FIELD_NAME" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" not-null="true"> 
     <column name="FIELD_NAME" /> 
    </property> 

    <property name="FIELD_VALUE" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" not-null="true"> 
     <column name="FIELD_VALUE" /> 
    </property> 
+0

你不確定它是否正確?一目瞭然,它看起來不錯。你有沒有試過它? – hometoast 2012-07-10 18:45:41

+0

我們是否必須創建一個單獨的類來映射組合鍵? – user595234 2012-07-10 18:57:59

回答

0

從我所收集,你應該重新聲明composite-id標籤以外的屬性(見example)。

我已經重寫的Equals實現,像這樣:

public override bool Equals(object obj) 
{ 
    var t = obj as ExceptionFld; 

    if (t == null) return false; 

    return EXCEPTION_ID == t.EXCEPTION_ID 
     && RUNID == t.RUNID 
     && ROW_ID == t.ROW_ID 
     && FIELD_NAME == t.FIELD_NAME; 
} 

,因爲我確信你當前的實現將拋出時調用這樣的NullReferenceException:

var instance = new ExceptionFld(); 
instance.Equals(""); 

當它真正應該只是返回false。

as運營商將嘗試從string轉換爲ExceptionFld,注意投射失敗,t將爲空。

我不確定您的GetHashCode關於性能或散列碼分佈,但除此之外,它看起來可行。

+0

您可能想要在投射之前檢查它是否爲空。如果'obj'爲null,那麼演員將會拋出一個異常。 – 2012-07-10 19:53:04

+1

這不是事實。嘗試運行'object nullRef = null; MyClass test = nullRef as MyClass;'看看會發生什麼。現在,它*有可能是括號轉換操作符最終可能會調用一些用戶定義的轉換,它將在null上失敗,但'as'永遠不會這樣做。 – Rytmis 2012-07-10 20:04:34