「Fluent NHibernate/フルーエントマッピング/複合主キー」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
(ページの作成:「Fluent NHibernate複合主キーを記述する方法。 == エンティティ == 複合主キーを用いるエンティティクラスでは、とくに...」)
 
imported>Administrator
12行目: 12行目:
 
     public override bool Equals(object obj)
 
     public override bool Equals(object obj)
 
     {
 
     {
         return base.Equals(obj);
+
         if (obj == null)
 +
        {
 +
            return false;
 +
        }
 +
        var cmp = obj as NodeX;
 +
        if (cmp == null)
 +
        {
 +
            return false;
 +
        }
 +
        if (Id1 != cmp.Id1 || Id2 != cmp.Id2)
 +
        {
 +
            return false;
 +
        }
 +
        return true;
 
     }
 
     }
  
18行目: 31行目:
 
     public override int GetHashCode()
 
     public override int GetHashCode()
 
     {
 
     {
         return base.GetHashCode();
+
         return (Id1 + "|" + Id2).GetHashCode();
 
     }
 
     }
 
}
 
}

2012年7月8日 (日) 08:37時点における版

Fluent NHibernate複合主キーを記述する方法。

エンティティ

複合主キーを用いるエンティティクラスでは、とくに何もしてなくてもEqualsメソッドとGetHashCodeメソッドをオーバーライドしておく必要がある。これをしないと実行時にエラーとなる。

public class NodeX
{
    public virtual long Id1 { get; set; }
    public virtual long Id2 { get; set; }

    // これ重要
    public override bool Equals(object obj)
    {
        if (obj == null)
        {
            return false;
        }
        var cmp = obj as NodeX;
        if (cmp == null)
        {
            return false;
        }
        if (Id1 != cmp.Id1 || Id2 != cmp.Id2)
        {
            return false;
        }
        return true;
    }

    // これも重要
    public override int GetHashCode()
    {
        return (Id1 + "|" + Id2).GetHashCode();
    }
}

マッピング

マッピングクラスではCompositeIdメソッドでマッピングを行う。 KeyPropertyメソッドで複合主キーにしたいカラムを次々と書いてくことで実現できる。

public class NodeXMap : ClassMap<NodeX>
{
    public NodeXMap()
    {
        CompositeId()
            .KeyProperty(x => x.Id1, "Id1")
            .KeyProperty(x => x.Id2, "Id2")
            ;
    }
}

関連項目

参考文献


外部リンク