有没有一个例子说明为什么Equals/GetHashCode应该在NHibernate中被覆盖?我发现很多帖子解释说Equals/GetHashCode应该总是在NHibernate实体类上被覆盖。如果我不使用套装,这真的有必要吗?我根本找不到缺少Equals/GetHashCode导致意外和错误行为的示例。没有他们,一切似乎都很完美。这很奇怪,每个人都说这是必要的,但没有人能提供一个例子来说明为什么需要它。最近在SO上有一个关于NHibernate执行selectN+1的问题,即使指定了fetch。问题是缺少Equals/GetHashCode实现。答案链接到另一个类似的问题。这是关于Equals/GetHashCode覆盖背后的原因的另一个问题。Nhibernaten+1具有三元关系。想要三元组中的中间实体尽管HQL提取Nhibernate生成代理NHibernate:覆盖Equals和GetHashCode的原因为什么Equals和GetHashCode对NHibernate如此重要编辑您不需要一直覆盖它们。如果您使用复合键、具有单独实体的多个会话或无状态会话,则可能是必需的。如果您只使用单个会话,NHibernate使用身份映射将实体存储到一级缓存。在这种情况下,实体比较是通过比较ID来完成的。在上述情况下(分离实体、无状态会话),NHibernate比较实际实体,而不是它们的ID。Object.Equals默认指的是相等。因此,如果两个对象指向完全相同的实例,则它们是相等的。您可能有两个具有相同标识的实例,但Object.Equals将为它们返回false。这与实体定义相反:一个对象不是由其属性定义的,而是由延续的线程及其身份定义的。JBossHibernatewiki对Equals和HashCode有很好的解释,代码示例很少。事实上,只有极少数情况会导致副作用。但如果你得到它们,它们会非常微妙。除了复合主键和字典键,它们始终需要正确的Equals/GetHashCode实现。NH只关心在内存中实例化实体一次,所以默认的引用比较应该可以工作......如果没有延迟加载。如果您不覆盖Equals,您将在处理代理时遇到问题。总是有两种情况:代理和真实实体。它们都代表同一个实体。只有当您使用正确实现的Equals方法时,它们才被认为是相同的。C#学习教程就是这些:是否有一个示例说明为什么您应该在NHibernate中覆盖Equals/GetHashCode?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
