我相信你的平等比较可能是错误的。对于NHibernate,我使用以下
Equals()
方法:
public static class EntityUtil
{
public static bool Equals(IEntity a, IEntity b)
{
// Transient entitys are never equal (unless they are ReferenceEquals)!
return
ReferenceEquals(a, b) || (
!((object)a == null || (object)b == null) &&
!(IsTransient(a) || IsTransient(b)) &&
NHibernateProxyHelper.GetClassWithoutInitializingProxy(a) == NHibernateProxyHelper.GetClassWithoutInitializingProxy(b) &&
a.Id.Equals(b.Id)
);
}
public static bool IsTransient(IEntity entity)
{
return entity.Id == 0;
}
}
我在单独的帮助程序类中定义了此方法,并在我的实体中使用它:
public class Entity : IEquatable<Entity>, IEquatable<IEntity>
{
private int? _hashCode;
public virtual int Id { get; protected set; }
public override bool Equals(object obj)
{
return EntityUtil.Equals((IEntity)this, obj as IEntity);
}
public virtual bool Equals(Entity obj)
{
return EntityUtil.Equals((IEntity)this, (IEntity)obj);
}
public virtual bool Equals(IEntity obj)
{
return EntityUtil.Equals((IEntity)this, obj);
}
public static bool operator ==(Entity a, Entity b)
{
return EntityUtil.Equals((IEntity)a, (IEntity)b);
}
public static bool operator !=(Entity a, Entity b)
{
return !(a == b);
}
public override int GetHashCode()
{
// GetHashCode needs to return a stable value.
if (!_hashCode.HasValue)
{
_hashCode =
NHibernateProxyHelper.GetClassWithoutInitializingProxy(this).GetHashCode() ^
((IEntity)this).Id.GetHashCode();
}
return _hashCode.Value;
}
}
这是与NHibernate平等合作的建议实施。也许这对你也有帮助。