Мы столкнулись с такого рода проблемами с данными, поступающими из базы данных и преобразованными в DTO (объект передачи данных).
Наш базовый класс для DTO переопределяет метод объекта, такой как Equals()
и GetHashCode()
какfollow:
public override Boolean Equals(Object obj)
{
// Null reference
if (null == obj)
return false;
// Same reference
if (Object.ReferenceEquals(this, obj))
return true;
EntityDTOBase<TEntity> entiteObj = obj as EntityDTOBase<TEntity>;
if (null == entiteObj)
return false;
else
return Equals(entiteObj);
}
public Boolean Equals(EntityDTOBase<TEntity> other)
{
// Null reference
if (null == other)
return false;
// Same reference
if (Object.ReferenceEquals(this, other))
return true;
// No Id: cannot be compared, return false
if (this.id == TypeHelper.DefaultValue<long>())
return false;
// Id comparison
if (this.id != other.id)
return false;
return true;
}
public override Int32 GetHashCode()
{
return this.id.GetHashCode();
}
Таким образом, проблема заключалась в том, что мы снова загружали одну и ту же сущность из базы данных, так как идентификатор такой же, некоторые привязки не были должным образом обновлены.
Эта конкретная проблема былаобойти, добавив дополнительный виртуальный метод EqualsExtended()
, реализация которого по умолчанию просто возвращает true
:
protected virtual Boolean EqualsExtended(EntityDTOBase<TEntity> other)
{
return true;
}
public Boolean Equals(EntityDTOBase<TEntity> other)
{
/// Same code as before (except last line):
return EqualsExtended(other);
}
Теперь в любой реализации нашего класса DTO мы можем добавить некоторую логику, чтобы Equals()
возвращал false в некоторыхситуации, например, путем добавления метки времени, когда данные извлекаются из базы данных:
protected override Boolean EqualsExtended(EntityDTOBase<Act> other
{
if (this.Timestamp != other.Timestamp)
{
return false;
}
return true;
}
Короче говоря, один из способов обойти эту проблему - заставить ваш экземпляр класса выглядеть иначе, когда вы хотитеГрафический интерфейс для обновления соответственно.