Cómo implementar IEquatable <T> cuando los campos mutables son parte de la igualdad - Problema con GetHashCode

Estoy usando Entity Framework en mi aplicación.

Implementé con la clase parcial de una entidad laIEquatable<T> interfaz:

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

Ahora en mi código lo uso de esta manera:

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

Tenga en cuenta (verifiqué en el visualizador del depurador) que la clase EntityCollection almacena sus entidades en HashSet, por lo que tiene que ver con la función GetHashCode, quiero que dependa de la ID para que las entidades sean comparadas por sus ID.

El problema es que cuando presiono guardar, la ID cambia de 0 a su valor db. Entonces, la pregunta es cómo puedo tener un objeto equitativo, que esté correctamente hash.

Ayúdame a encontrar lo que está mal en la función GetHashCode (por ID) y qué puedo cambiar para que funcione.

Muchas gracias.

Respuestas a la pregunta(2)

Su respuesta a la pregunta