用方法替换.Equals而不是覆盖它是否合理?

时间:2013-08-11 06:54:06

标签: c# entity-framework

我正在使用Entity Framework 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那里得到错误说:角色的变化冲突

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

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

1 个答案:

答案 0 :(得分:2)

请注意 - GetHashCode和Equals应该实现相同的逻辑。即 - 相等的对象应具有相同的哈希码。这不是这里的情况,其中哈希码来自Id,而相等与Id无关。

如果覆盖一个,则必须覆盖它们。

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