我发现很多帖子都解释了应该始终覆盖 NHibernate 实体类上的 Equals/GetHashCode。如果我不使用 Sets,这真的有必要吗?
我根本找不到显示缺少 Equals/GetHashCode 会导致意外和错误行为的示例。没有它们,一切似乎都能完美运行。这真的很奇怪,每个人都说这是必要的,但没有人可以提供一个示例来说明为什么这是需要的。
最佳答案
有一个question最近关于 NHibernate 做选择 N+1,即使指定了 fetch
。问题was缺少 Equals
/GetHashCode
实现。
答案链接到另一个类似的question .
这是 another question关于 Equals
/GetHashCode
覆盖背后的推理。
Nhibernate n+1 with ternary relationship. Want the middle entity in the ternary
Nhibernate producing proxy despite HQL fetch
NHibernate: Reasons for overriding Equals and GetHashCode
Why Equals and GetHashCode are so important to NHibernate
Why is it important to override GetHashCode when Equals method is overridden?
编辑
您不需要一直覆盖它们。如果您使用复合键、具有分离实体的多个 session 或无状态 session ,则可能有必要。
如果您只使用单个 session ,NHibernate 会使用标识映射将实体存储到一级缓存。这种情况下的实体比较是通过比较 id 来完成的。
在上述情况下(分离实体、无状态 session ),NHibernate 比较实际实体,而不是它们的 ID。默认情况下,Object.Equals
会引用相等性。因此,如果两个对象指向完全相同的实例,则它们是相等的。您可能有两个具有相同身份的实例,但 Object.Equals
会为它们返回 false
。这与 Entity
definition 形成对比:
An object that is not defined by its attributes, but rather by a thread of continuity and its identity.
JBoss Hibernate wiki 有 a good explanation关于 Equals
和 HashCode
以及一些代码示例。
关于c# - 是否有示例说明为什么应在 NHibernate 中覆盖 Equals/GetHashCode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11446152/