【发布时间】:2011-02-03 20:23:35
【问题描述】:
我在一些 NHibernate 示例中看到使用了抽象基实体类,它覆盖了 Equals、GetHashCode 来处理瞬态实体、代理对象(在延迟加载场景中......我猜)。
真的有必要实现这样一个抽象基实体类来派生我所有的实体吗?
【问题讨论】:
标签: nhibernate
我在一些 NHibernate 示例中看到使用了抽象基实体类,它覆盖了 Equals、GetHashCode 来处理瞬态实体、代理对象(在延迟加载场景中......我猜)。
真的有必要实现这样一个抽象基实体类来派生我所有的实体吗?
【问题讨论】:
标签: nhibernate
完全没有必要。它只是让事情变得更容易,因为您可以在其上放置诸如 Id 之类的东西。以及您之前提到的常见功能,例如 Equals/GetHashCode。
【讨论】:
是的,基类本身不是必需的,但覆盖 Equals 和 GetHashcode 是您想要对所有实体执行的操作,因此基类可以减少重复性
【讨论】:
根据我的经验,拥有一个公开 Id 属性的基类对于能够创建利用它的通用存储库方法或自动映射约定非常有用。
然而,重写 Equals 是另一回事。
这样做会在您比较它们时强制加载未初始化的代理(例如,通过对序列调用 Distinct)。出于这个原因,最好只对可能被缓存的很少更改实体的类层次结构进行处理。
【讨论】:
如果你想进行延迟加载,肯定需要重写 Equals。 这是因为 NHibernate 依赖 Equals 方法来确定相等性。默认为引用相等。
当 NHibernate 实现延迟加载时,它使用代理对象,它们是真实实体类的子类,每个成员都被覆盖以启用延迟加载。
因此,您的应用程序可以识别代理对象与其作为真实实例的对象相同 - 它根本不应该知道代理对象。
因此,您必须重写 Equals 运算符才能智能地识别相等性(在检查引用相等性...等之后),如果对象的 ID 相等,则对象相等。
【讨论】: