NHibernateで次のテストに合格するにはどうすればよいですか?
これが私が望むように機能するには、エンティティクラスのEqualsとGetHashCodeを単純にオーバーライドするだけで十分だと思いました。明らかに、非常に些細な「ポイント」オブジェクトの場合、同じ座標に対して複数の行を永続化するのはばかげています。同一の座標を持つ2つのポイントオブジェクトがあり、それらをデータベースの1つの行にのみ保持する必要があります。
Point p1 = new Point(1, 1, 1);
Point p2 = new Point(1, 1, 1);
Assert.AreEqual(p1, p2); //Passes
session.Save(p1);
session.Save(p2);
tx.Commit();
IList<Point> points = session.CreateCriteria<Point>()
.List<Point>();
Assert.AreEqual(1,points.Count); //FAILS
私のポイントクラスは次のようになります。
public class Point
{
public virtual Guid Id { get; set; }
public virtual double X { get; set; }
public virtual double Y { get; set; }
public virtual double Z { get; set; }
public Point(double x, double y, double z)
{
X = x; Y = y; Z = z;
}
public override bool Equals(object obj)
{
Point you = obj as Point;
if (you != null)
return you.X == X && you.Y == Y && you.Z == Z;
return false;
}
public override int GetHashCode()
{
int hash = 23;
hash = hash * 37 + X.GetHashCode();
hash = hash * 37 + Y.GetHashCode();
hash = hash * 37 + Z.GetHashCode();
return hash;
}
}