NHibernate和生成抽象实体基类

NHibernate和生成抽象实体基类,nhibernate,Nhibernate,我在一些NHibernate示例中看到使用了一个抽象的基本实体类,它重写了Equals,GetHashCode,来处理临时实体,代理对象(我猜是在延迟加载场景中) 真的有必要实现这样一个抽象的基本实体类来派生我的所有实体吗?根本没有必要。它只是让事情变得更简单,因为你可以在上面放上像Id这样的东西。以及前面提到的Equals/GetHashCode等常见功能。是的,基类本身不是必需的,但覆盖Equals和GetHashCode是您希望在所有实体上执行的操作,因此根据我的经验,基类可以大大减少重复

我在一些NHibernate示例中看到使用了一个抽象的基本实体类,它重写了Equals,GetHashCode,来处理临时实体,代理对象(我猜是在延迟加载场景中)


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

根本没有必要。它只是让事情变得更简单,因为你可以在上面放上像Id这样的东西。以及前面提到的Equals/GetHashCode等常见功能。

是的,基类本身不是必需的,但覆盖Equals和GetHashCode是您希望在所有实体上执行的操作,因此根据我的经验,基类可以大大减少重复性,拥有一个公开Id属性的基类对于能够创建利用该属性的通用存储库方法或自动映射约定非常有用

然而,压倒平等是另一回事


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

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

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

因此,应用程序要识别代理对象与对象相同,就意味着它是真实的实例——它根本不应该知道代理对象


因此,如果对象的ID相等,则必须重写Equals操作符以智能地识别相等(在检查引用相等…等之后),即对象相等

我必须同意diego的观点,我只为我的Id字段使用了一个基本抽象类。在重写Equals GetHashCode之后,我在ISet的Remove()方法中遇到了问题。请看这篇文章:在我重写了Equals GetHashCode之后,ISet的Remove()方法遇到了问题。请参阅此帖子:。