我在我的应用程序中使用实体框架。
我用实体的部分类实现了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 函数有关,我希望它依赖于 ID,以便实体通过其 ID 进行比较。
问题是当我点击保存时,ID 从 0 更改为其 db 值。
所以问题是我怎样才能有一个可相等的对象,并被正确地散列。
请帮助我找出 GetHashCode 函数(按 ID)中的问题以及我可以更改哪些内容以使其正常工作。
多谢。
您使用了可变字段(AddressId
)作为哈希的一部分 - 不幸的是这是注定的。我的意思是:当你添加它时,AddressId
是0? -1?没关系exactly,但它不是最终的 id - 它是与此密钥/哈希一起存储的。当您保存它时,actual是个IDENTITY
数据库中的列)被更新到对象中。
很简单,你cannot如果该值是字典的一部分时可以更改,则可以可靠地对该值进行哈希处理。一种可能的解决方法是考虑工作单元,即插入是一个工作单元。含义:如果数据等仅存在于此时间,那么这不是问题,因为您在保存数据后永远不会尝试访问数据。随后(在不同的上下文中)加载数据也应该没问题,因为 id 在生命周期内不会改变。
或者:删除这个哈希/等式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)