gpt4 book ai didi

c# - NHibernate 平等 : How do I ensure only one row is persisted from many "equal" . NET 对象?

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:53 26 4
gpt4 key购买 nike

如何使用 NHibernate 通过以下测试?

我认为只需覆盖实体类中的 Equals 和 GetHashCode 就足以使其按照我希望的方式工作。显然,对于非常微不足道的“点”对象,为相同的坐标保留多行是愚蠢的。我有两个具有相同坐标的点对象,我希望它们只保留在数据库中的一行。

    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;
}
}

最佳答案

我认为您是从错误的角度解决问题的。

如果这是您的实际域,您应该为点使用组件或用户类型,而不是单独的表。点显然具有值类型语义。

阅读http://nhibernate.info/doc/nh/en/index.html#componentshttp://nhibernate.info/doc/nh/en/index.html#mapping-types-custom

关于c# - NHibernate 平等 : How do I ensure only one row is persisted from many "equal" . NET 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com