How can the following problem be dealt with?
We\'re using lazy loaded NHibernate properties and whenever we\'re calling Equals()
or GetHashCode()<
If you are using identity equality, you should be able to access the key without triggering a load:
public virtual bool Equals(ClassB other)
{
if (ReferenceEquals(null, other))
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
// needs to check for null Id
return Equals(other.ClassC.Id, ClassC.Id) && Equals(other.ClassD.Id, ClassD.Id);
}
You can handle comparisons between objects before and after persisting by caching the hash code when it was transient. This leaves a small gap in the Equals contract in that a comparison between an existing object that was transient will not generate the same hash code as a newly-retrieved version of the same object.
public abstract class Entity
{
private int? _cachedHashCode;
public virtual int EntityId { get; private set; }
public virtual bool IsTransient { get { return EntityId == 0; } }
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
var other = obj as Entity;
return Equals(other);
}
public virtual bool Equals(Entity other)
{
if (other == null)
{
return false;
}
if (IsTransient ^ other.IsTransient)
{
return false;
}
if (IsTransient && other.IsTransient)
{
return ReferenceEquals(this, other);
}
return EntityId.Equals(other.EntityId);
}
public override int GetHashCode()
{
if (!_cachedHashCode.HasValue)
{
_cachedHashCode = IsTransient ? base.GetHashCode() : EntityId.GetHashCode();
}
return _cachedHashCode.Value;
}
}