There was a question on SO recently about NHibernate doing select N+1 even if fetch
is specified. The problem was with missing Equals
/ GetHashCode
implementation.
The answer links to another similar question.
Here's another question on reasoning behind Equals
/ GetHashCode
overrides.
Nhibernate n+1 with ternary relationship. Want the middle entity in the ternary
Nhibernate producing proxy despite HQL fetch
NHibernate: Reasons for overriding Equals and GetHashCode
Why Equals and GetHashCode are so important to NHibernate
Why is it important to override GetHashCode when Equals method is overridden?
Edit
You don't need to override them all the time. It may be necessary if you are using composite keys, multiple sessions with detached entities or stateless sessions.
If you are working with a single session only, NHibernate stores the entities to first level cache using an identity map. Entity comparison in that case is done by comparing ids.
In cases above (detached entity, stateless session), NHibernate compares actual entities, not their ids. By default, Object.Equals
does reference equality. So two objects are equal if they point to the exact same instance. You might have two instances with the same identity, but Object.Equals
would return false
for them. This is in contrast with the Entity
definition:
An object that is not defined by its attributes, but rather by a
thread of continuity and its identity.
JBoss Hibernate wiki has a good explanation on Equals
and HashCode
with few code examples.