Como implementar IEquatable <T> quando campos mutáveis fazem parte da igualdade - Problema com GetHashCode

Estou usando o Entity Framework no meu aplicativo.

Eu implementei com a classe parcial de uma entidade oIEquatable<T> interface:

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

Agora, no meu código, eu o uso desta maneira:

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

Observe (verifiquei no visualizador do depurador) que a classe EntityCollection armazena suas entidades no HashSet, por isso tem a ver com a função GetHashCode. Quero que dependa do ID para que as entidades sejam comparadas por seus IDs.

O problema é que, quando clico em salvar, o ID muda de 0 para seu valor de banco de dados. Portanto, a questão é como posso ter um objeto equável, sendo devidamente dividido por hash.

Por favor, ajude-me a descobrir o que há de errado na função GetHashCode (por ID) e o que posso alterar para que funcione.

Muito obrigado.

questionAnswers(2)

yourAnswerToTheQuestion