IComparable踩坑记

发布时间 2023-06-10 17:07:51作者: long-live

前序:时隔三个月,我回到了博客园。
我接手了一个老项目代码,老手开腾讯会议告诉我核心代码意义,在操作后台系统下拉框选择某个作物类型的时候,出现bug了,数据列表不会筛选。
这是正常的情况:

当选择“南方水稻”类型时,出现bug了,列表不刷新,意味这“南方水稻”的返回的数据有问题:

报错:

错误信息很明显,返回值某个对象没有Name属性,准确说就是没有这个对象,仔细看看返回值和正常的相比没有CopyType对象了,估计就是CopyType.Name报错。
在后台接口的返回值处打断点:

从断点上看,返回的值确确实实是有CopyType对象的!但为什么前端就接收不到呢???
我注意到返回值被Json化,网上也搜到说Json会导致循环引用,然后报错,但是也没有出现Self字样呀!我在想循环引用是返回的对象包含的对象中有相同的字段,或者实体之间相互引用了。但是都没有,在我一头雾水的时候,返回值两个对象的Id值是一样的,我猜想是不是Id一样才会报错,然后测试验证确实如此。网上没有搜到这样情况,说明大概率是代码中有bug。
我翻到BaseModel类,继承了IComparable,有一行代码引起我的注意:

不难看出是实体和实体的Id比较,我很强烈感觉就是这里因为Id相等被过滤掉了,我注释掉真的对了。我想只有类型相同的实体才有比较Id的意义,然后我把代码改成:

最后列表正常了。
据老手说以前不会有这个bug,可能是最近由EF切到EF core框架差异导致。