Я использую 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 (по идентификатору) и что я могу изменить, чтобы она работала.
Большое спасибо.