Как реализовать IEquatable <T>, когда изменяемые поля являются частью равенства - проблема с GetHashCode

Я использую Entity Framework в своем приложении.

Я реализовал с частичным классом сущностиIEquatable<T> интерфейс:

Partial Class Address : Implements IEquatable(Of Address) 'Other part generated
  Public Overloads Function Equals(ByVal other As Address) As Boolean _
      Implements System.IEquatable(Of Address).Equals
    If ReferenceEquals(Me, other) Then Return True
    Return AddressId = other.AddressId
  End Function

  Public Overrides Function Equals(ByVal obj As Object) As Boolean
    If obj Is Nothing Then Return MyBase.Equals(obj)
    If TypeOf obj Is Address Then 
      Return Equals(DirectCast(obj, Address)) 
  Else
    Return False
  End Function

  Public Overrides Function GetHashCode() As Integer
    Return AddressId.GetHashCode
  End Function
End Class

Теперь в моем коде я использую это так:

Sub Main()
  Using e As New CompleteKitchenEntities
    Dim job = e.Job.FirstOrDefault
    Dim address As New Address()

    job.Addresses.Add(address)
    Dim contains1 = job.Addresses.Contains(address) 'True
    e.SaveChanges()
    Dim contains2 = job.Addresses.Contains(address) 'False

    'The problem is that I can't remove it:
    Dim removed = job.Addresses.Remoeve(address) 'False

  End Using
End Sub

Обратите внимание (я проверил в визуализаторе отладчика), что класс EntityCollection хранит свои сущности в HashSet, поэтому он имеет отношение к функции GetHashCode, я хочу, чтобы она зависела от идентификатора, поэтому сущности сравниваются по своим идентификаторам.

Проблема в том, что когда я нажимаю сохранить, идентификатор изменяется от 0 до его значения в БД. Таким образом, вопрос в том, как я могу получить уравновешенный объект, должным образом хешированный.

Пожалуйста, помогите мне найти, что не так в функции GetHashCode (по идентификатору) и что я могу изменить, чтобы она работала.

Большое спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос