Два объекта равны, если они одного типа и имеют одинаковый первичный ключ.
Если у вас есть целые числа для ключей:
- Проверьте равенство ссылок, как сейчас
- Если у вас есть метод Equal в каком-то базовом классе, вы проверяете, чтотипы, которые вы сравниваете, равны.Здесь вы можете столкнуться с проблемами с прокси, я вернусь к этому
- Проверьте, равны ли первичные ключи - это не вызовет ленивой загрузки
Если у вас естьGUID для ключей:
- Проверьте равенство ссылок, как вы делаете сейчас
- Проверьте, равны ли первичные ключи - это не приведет к отложенной загрузке
Если у меня есть целые числа для ключей, у меня обычно есть что-то вроде этого Equal-override в базовом классе для моих сущностей:
public virtual bool Equals(EntityBase other)
{
if (other == null)
{
return false;
}
if (ReferenceEquals(other, this))
{
return true;
}
var otherType = NHibernateProxyHelper.GetClassWithoutInitializingProxy(other);
var thisType = NHibernateProxyHelper.GetClassWithoutInitializingProxy(this);
if (!otherType.Equals(thisType))
{
return false;
}
bool otherIsTransient = Equals(other.Id, 0);
bool thisIsTransient = Equals(Id, 0);
if (otherIsTransient || thisIsTransient)
return false;
return other.Id.Equals(Id);
}
Теперь, если вы сущности, которые наследуют от других, используя таблицу в иерархии, вы столкнетесь сПроблема в том, что GetClassWithoutInitializingProxy будет возвращать базовый класс иерархии, если это прокси, и более конкретный тип, если это загруженная сущность.В одном проекте я справился с этим, обойдя иерархию и, таким образом, всегда сравнивая базовые типы - прокси или нет.
В наши дни я бы всегда использовал GUID в качестве ключей и делал, как описано здесь: http://nhibernate.info/doc/patternsandpractices/identity-field-equality-and-hash-code.html
Тогда проблем с несоответствием типов прокси нет.