我想比较记录以查看它们之间是否存在差异。
Person
桌子:
ID Name Address
--------------------------------
1 John Smith 123 A Street
2 John Smith 123 A Street
3 John Smith 234 B Street
记录 1 和 2 是“相等的”。记录 2 和 3 “不相等”。
我IEquatable
在模型上实现Person
如下。
public static bool operator ==(Person p1, Person p2)
{
if (System.Object.ReferenceEquals(p1, p2)) return true;
return p1.Equals(p2);
}
public static bool operator !=(Person p1, Person p2)
{
return !(p1== p2);
}
public bool Equals(Person other)
{
if (System.Object.ReferenceEquals(this, other)) return true;
if (Name != other.Name) return false;
if (Address != other.Address) return false;
return true;
}
public override bool Equals(object obj)
{
Person person = obj as Person;
if (person == null) return false;
return Equals(person);
}
public override int GetHashCode()
{
unchecked
{
int hash = (int)2166136261;
hash = hash * 25165843 ^ (Name != null ? Name .GetHashCode() : 0);
hash = hash * 25165843 ^ (Address != null ? Address.GetHashCode() : 0);
return hash;
}
}
问题是当Persons
来自导航属性的 ICollection 被具体化时。它缺少彼此“相等”的记录(即返回单个 John Smith 123 A Street 记录)。我猜这是因为默认情况下它会考虑具有唯一主键的不同实体。通过覆盖 equals 它认为两个记录是同一个实体。
屏幕截图显示Addresses
而不是Persons
:(顶部有IEquatable
,底部没有)
//Addresses Definition (generated code)
public virtual ICollection<Address> Addresses { get; set; }
我如何协调 EF 需要在对象级别看到平等与我想要看到逻辑平等?