0

NHibernate では、クラスとそのマッピングを定義します。複合キーの定義と equals/GetHashCode が正しいかどうかわかりません。

[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>
4

1 に答える 1

0

私が収集したことから、タグの外側でプロパティを再宣言しないでください (を参照)。composite-id

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演算子は from からstringto へのキャストを試みますExceptionFldが、キャストが失敗し、t が null になることに注意してください。

パフォーマンスやハッシュコードの配布に関してはわかりませんGetHashCodeが、それ以外は機能しているようです。

于 2012-07-10T19:42:56.340 に答える