当可变字段是等式的一部分时如何实现 IEquatable - GetHashCode 问题

2023-12-07

我在我的应用程序中使用实体框架。

我用实体的部分类实现了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(使用前将#替换为@)

当可变字段是等式的一部分时如何实现 IEquatable - GetHashCode 问题 的相关文章

随机推荐

  • 如何将十六进制字符串转换为十进制?

    如果您能告诉我如何转换十六进制字母 我将不胜感激NSString e g 50A6C2 使用 Objective C 转换为小数 提前致谢 最简单的方法是使用NS扫描仪 具体方法scanHexInt or scanHexLongLong 另
  • 如何从晨星上抓取数据

    所以我对网络抓取世界还是个新手 到目前为止我只真正使用 beautifulsoup 从网站上抓取文本和图像 我想我应该尝试从图表上刮掉一些数据点来测试我的理解 但我对此有点困惑graph 在检查了我想要提取的数据的元素后 我看到了这一点 s
  • 如何使用 jQuery 单击事件基于 JSON 查询异步更改 href 值

    我正在使用bit ly 网址缩短服务缩短发送到 在 Twitter 上分享 功能的某些 URL 我想仅在用户实际按下共享按钮时加载 bit ly url 由于 bit ly 的最多 5 个并行请求限制 Bit ly 的 REST API返回
  • SQL Server ISDATE() 函数 - 有人能解释一下吗?

    因此 我查看了 SQL Server 中 ISDATE 函数的文档 并在示例中看到了这一点 SET DATEFORMAT mdy SELECT ISDATE 15 04 2008 Returns 0 SET DATEFORMAT mdy S
  • C# - 关键字使用 virtual+override 与 new

    在基类型中声明方法有什么区别 virtual 然后使用 在子类型中覆盖它override 关键字而不是简单地使用 new 子类型中声明匹配方法时的关键字 我总是发现这样的事情用图片更容易理解 再次 采用约瑟夫 戴格尔的代码 public c
  • VBA 调试器仅显示集合的 256 个元素

    我正在研究 Excel 宏 调试器是否有一个选项可以像数组一样显示所有元素 如果不是 唯一的解决方法是在膨胀集合后将我的类对象存储在数组中吗 你可以使用debug print并将输出写入立即窗口并以此方式绕过限制 我几乎可以肯定没有办法增加
  • 如何在twig模板中显示包含HTML的字符串?

    如何在 twig 模板中显示包含 HTML 标签的字符串 我的 PHP 变量包含以下 html 和文本 word b a word b 当我在我的树枝模板中执行此操作时 word 我明白了 lt b gt a word lt b gt 我想
  • 使用 Yahoo SMTP 以 PHP 发送邮件

    我如何通过以下方式发送电子邮件Yahoo PHP 中的 SMTP 服务器 你应该使用类似的东西斯威夫特 梅勒 or PHP邮件程序 以下示例适用于 Swift message Swift Message newInstance gt set
  • UnauthorizedAccessException:更改 AD 密码时访问被拒绝

    我尝试编写 C 代码来更新 Server 2012 中的域用户密码 我根据以下代码使用以下代码这个堆栈溢出答案 using var context new PrincipalContext ContextType Domain test c
  • 从 Cocoa 中的文件读取时间戳?

    我想读取文件创建 或上次修改 的时间 如 Finder 修改日期 中所示 Cocoa中有没有现有的方法可以做到这一点 谢谢 如果您使用的是 10 5 或更高版本 则可以使用 NSFileManager attributesOfItemAtP
  • 在 doPost() 中访问请求标头

    要验证 Webhook 我需要从请求标头获取参数 到目前为止 我找不到任何信息是否确实可以在应用程序脚本中访问这些标头 到目前为止唯一有效的是访问发布请求的正文 function doPost e something like this v
  • Google Cloud ML Engine - 作业因内部错误而失败。无法执行作业

    这是我之前训练成功的一个ml job 但当我今天尝试时 它不起作用 所以在那之后我尝试删除桶中的所有东西并重新开始 但它仍然不起作用 给出以下错误 发生内部错误 请在几分钟后重试 如果您仍然遇到错误 请联系 Cloud ML None
  • .prev(选择器)不起作用

    这是问题所在 实时复制 CSS div border 1px solid black HTML div div br div div br div class test Should have a blue border div br di
  • 如何垂直移动JApplet内的图像?

    我已经在 J Applet 中显示了一个图像 球 现在我希望图像以垂直方式 上下 移动 问题是我不知道该怎么做 有人对这个问题有想法吗 您需要将该图像的位置设置为某个计算值 意味着您使用时间 速度和其他限制来计算垂直位置 如何设置该位置取决
  • Ljava.lang.Object;无法转换为 [Ljava.lang.Integer

    我编写了一个泛型类 下面是该类的构造函数 我想做这样的事情 如行中所写 elements E new Object size 因为我不知道运行时的泛型类型 所以它会抛出异常 public class Stack
  • (x==0) 能比 (0==x) 更有效吗? [复制]

    这个问题在这里已经有答案了 可能的重复 if flag 0 和 if 0 flag 哪个执行得更快 我通常将平等条件写为 if 0 x 正如很多人所做的那样 而不是 if x 0 这样当我不小心输入 而不是 时 编译器会告诉我 有人告诉我
  • 在 C# 中将字符串转换为位图

    我想将字符串转换为位图或可以在像素框中显示的内容 我的字符串看起来像这样 string rxstring 0100100100200200200300300300400400400500500500600600600700700700800
  • 递归调用函数以获取用户输入

    我正在尝试制作一个石头剪刀布游戏 并正在尝试验证输入 def player1 x raw input please select Rock r Paper p Scissors s lower if x r or x p or x s or
  • 将 HTML 片段附加到 Angular 6 中的视图

    我从对外部系统的http请求中获取了一段html代码 我应该在我的角度应用程序的视图中显示它 准确地说 这是我必须显示的 html 片段 每个请求和响应都会有点不同 div div 我使用不同的解决方案建议 例如innerHtml 但它们都
  • 当可变字段是等式的一部分时如何实现 IEquatable - GetHashCode 问题

    我在我的应用程序中使用实体框架 我用实体的部分类实现了IEquatable