gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:00:05 25 4
gpt4 key购买 nike

我发现很多帖子都解释了应该始终覆盖 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/

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