用方法替换.Equals而不是重写它合理吗

本文关键字:重写 方法 替换 Equals | 更新日期: 2023-09-27 18:27:06

我使用的是实体框架5,我试图覆盖.Equals和.GetHashCode

public class Students    {
    public int PersonId { get; set; }
    public string Name { get; set; }
    public int Age {get; set;} 
    public override bool Equals(object obj)
    {
        return this.Equals(obj as Students);
    }
    public bool Equals(Students other)
    {
        if (other == null)
            return false;
        return this.Age.Equals(other.Age) &&
            (
                this.Name == other.Name ||
                this.Name != null &&
                this.Name.Equals(other.Name)
            );
    }
    public override int GetHashCode()
    {
        return PersonId.GetHashCode();
    }
}

然而,我非常简单的方法似乎不起作用,我从EF那里得到了错误:角色的冲突更改

我认为这是由于英孚进行比较的方式。

有没有一种方法可以让我提供自己的方法,并以与.Equals相同的方式调用它?我在想也许我可以编写一个名为的方法。Same并使用它。这样做合理吗?如果我这样做了,并且我想比较两个对象,那么我怎么能对它进行编码和调用呢?

用方法替换.Equals而不是重写它合理吗

请注意,GetHashCode和Equals应该实现相同的逻辑。也就是说,相等的对象应该具有相同的哈希代码。这里的情况并非如此,散列代码来自Id,而相等与Id无关。

如果覆盖其中一个,则必须覆盖两者。

你可以在你的域中使用你想要的任何逻辑,但EF和其他人可能会使用默认值,你必须保持它们的一致性。