c# - 是否有示例说明为什么应在 NHibernate 中覆盖 Equals/GetHashCode?

标签 c# .net nhibernate domain-driven-design

我发现很多帖子都解释了应该始终覆盖 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关于 EqualsHashCode 以及一些代码示例。

关于c# - 是否有示例说明为什么应在 NHibernate 中覆盖 Equals/GetHashCode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11446152/

相关文章:

c# - 无法从 Web 配置文件访问文件夹路径

C# 从 MP4 流中提取位图

c# - 避免 XML 文档中的冗余

c# - .NET:ListView 蓝调?

.net - 网站版本2,使用PHP还是迁移到.Net?

c# - 设置包含自身值加上其他属性值的属性值

c#访问空闲工作流数据

c# - TryParse 一行 : accepted challenge?

c# - 带有子计数的 NHibernate 父列表

c# - NHibernate ISession 生命周期;什么时候可以在每个存储库方法中创建/处置?