是否有一个示例为什么应该在NHibernate中覆盖Equals/GetHashCode?

Ant*_*ino 7 .net c# nhibernate domain-driven-design

我发现很多帖子都解释说应该总是在NHibernate实体类上重写Equals/GetHashCode.如果我不使用套装,这真的有必要吗?

我根本找不到一个示例,其中显示缺少Equals/GetHashCode会导致意外和错误的行为.没有它们,一切似乎都很完美.这真是奇怪,每个人都说这是必要的,但没有人能提供一个样本,说明为什么需要这样做.

Mir*_*vic 11

有一个问题上所以最近关于NHibernate的做选择N + 1即使fetch被指定.问题在于缺失Equals/ GetHashCode实施.

答案链接到另一个类似的问题.

这是关于推理背后/ 覆盖的另一个问题.EqualsGetHashCode

Nhibernate n + 1与三元关系.
尽管HQL获取
NHibernate,希望三元Nhibernate生成代理中的中间实体:重写Equals和GetHashCode的
原因为什么Equals和GetHashCode对于NHibernate如此重要
为什么在重写Equals方法时重写GetHashCode很重要?


编辑

您无需一直覆盖它们.如果您使用复合键,具有分离实体的多个会话或无状态会话,则可能是必要的.

如果您只使用单个会话,NHibernate会使用身份映射将实体存储到第一级缓存.在这种情况下,实体比较是通过比较ID来完成的.

在上述情况下(分离实体,无状态会话),NHibernate比较实际实体,而不是它们的ID.默认情况下,Object.Equals引用相等.因此,如果两个对象指向完全相同的实例,则它们是相等的.您可能有两个具有相同标识的实例,但Object.Equalsfalse为它们返回.这与Entity 定义形成对比:

不是由其属性定义的对象,而是由连续性线程及其标识定义的对象.

JBoss的Hibernate的wiki有一个很好的解释Equals,并HashCode与一些代码示例.