我在一些NHibernate示例中看到,使用了一个抽象基类实体类,它已经重写了Equals,GetHashCode来处理瞬态实体,代理对象(在延迟加载场景中......我猜)。
是否真的有必要实现这样一个抽象的基本实体类来派生我的所有实体?
答案 0 :(得分:2)
根本没必要。它只是让事情变得更容易,因为你可以把Id这样的东西放在上面。正如您之前提到的常见功能,如Equals / GetHashCode。
答案 1 :(得分:2)
是的,基类本身不是必需的,但是重写Equals和GetHashcode是你想要在所有实体上做的事情,所以基类使得重复性降低很多
答案 2 :(得分:2)
根据我的经验,拥有一个公开Id属性的基类对于能够创建利用它的通用存储库方法或自动映射约定非常有用。
然而,Overriding Equals是另一个故事。
这样做会在比较它们时强制加载未初始化的代理(例如,通过在序列上调用Distinct)。出于这个原因,最好只对可能被缓存的很少变化的实体的类层次结构进行。
答案 3 :(得分:1)
如果要进行延迟加载,则必须定义重写等于。 这是因为NHibernate依赖于Equals方法来确定相等性。默认值是引用相等。
当NHibernate实现延迟加载时,它使用代理对象,它们是真实实体类的子类,每个成员都被覆盖以启用延迟加载。
因此,对于您的应用程序来说,识别代理对象与它应该是真实实例的对象相同 - 它根本不应该知道代理对象。
因此,您必须覆盖Equals运算符以智能地识别相等(如果检查引用相等...等),如果它们的ID相等,则对象是相等的。