2011-02-03 88 views
0

我在一些NHibernate示例中看到使用了抽象基类实体类,它重写了Equals,GetHashCode来处理瞬态实体,代理对象(在延迟加载场景中..我想) 。NHibernate和制作抽象实体基类

真的有必要实现这样一个抽象基类实体来派生我所有的实体吗?

回答

1

如果要执行延迟加载,则必须定义重写等式。 这是因为NHibernate依赖于Equals方法来确定相等性。默认值是引用相等。

当NHibernate实现延迟加载时,它使用代理对象,这是实体类的子类,每个成员都被覆盖以启用延迟加载。

因此,为了让您的应用程序识别代理对象与对象相同,它应该是真实的实例 - 它根本不应该知道代理对象。

因此,您必须重写Equals运算符以智能地识别相等(如果检查引用相等...等),如果对象的ID相等,则对象相等。

2

根本不需要。它让事情变得更容易,因为你可以在其上放置Id等内容。像你之前提到的像Equals/GetHashCode一样的通用功能。

2

呀,基类本身是不需要的,但压倒一切的Equals和GetHashCode是你要在所有的实体做一些事情,所以基类可以说少了很多的repetetive

2

根据我的经验,具有公开Id属性的基类对于能够创建利用该属性的通用存储库方法或自动映射约定非常有用。

但是,压倒一切的等于是另一回事。

这样做会在您比较它们时强制加载未初始化的代理(例如,通过对序列调用Distinct)。出于这个原因,最好只对可能被缓存的很少更改的实体的类层次结构进行处理。

+0

我不得不同意迭戈这里,我只使用一个基本的抽象类为我的Id字段。 – Rippo 2011-02-04 05:36:58

+0

我在重写Equals,GetHashCode后遇到了ISet的Remove()方法中的麻烦。请看这篇文章:http://stackoverflow.com/questions/5040043/nhibernate-iesi-iset-fails-to-remove – 2011-02-21 22:08:53