Wie man IEquatable <T> implementiert, wenn veränderbare Felder Teil der Gleichheit sind - Problem mit GetHashCode

Ich verwende Entity Framework in meiner Anwendung.

Ich habe mit der Teilklasse einer Entität das @ implementieIEquatable<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

Nun in meinem Code benutze ich es so:

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

Hinweis (ich habe im Debugger-Visualizer überprüft), dass die EntityCollection-Klasse ihre Entitäten in HashSet speichert, damit dies mit der GetHashCode-Funktion zusammenhängt. Ich möchte, dass sie von der ID abhängt, damit Entitäten anhand ihrer IDs verglichen werden.

Das Problem ist, dass sich die ID von 0 auf den DB-Wert ändert, wenn ich auf Speichern drücke. Die Frage ist also, wie ich ein gleichwertiges Objekt haben kann, das richtig gehasht wurde.

Bitte hilf mir herauszufinden, was an der GetHashCode-Funktion (anhand der ID) falsch ist und was ich ändern kann, damit es funktioniert.

Danke vielmals

Antworten auf die Frage(2)

Ihre Antwort auf die Frage