为POCO实现IEquatable

Eri*_* J. 6 iequatable entity-framework-4

我注意到EF的DbSet.Add()非常慢.一个小小的谷歌搜索出现了一个SO答案,承诺高达180倍的性能提升:

/sf/answers/493675311/

但是,我不明白如何IEquatable<T>按照答案中的建议实施.

根据MSDN,如果我实现IEquatable<T>,我也应该覆盖Equals()GetHashCode().

和许多POCO一样,我的对象是可变的.在提交到database(SaveChanges())之前,新对象的Id为0. 保存对象,Id作为实现IEquatable,Equals()和GetHashCode()的理想基础.

在哈希代码中包含任何可变属性是不明智的,因为根据MSDN

如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值

我应该实现IEquatable<T>逐个属性比较(例如this.FirstName == other.FirstName)并且不重写Equals()和GetHashCode()吗?

鉴于我的POCO用于EntityFramework上下文,是否应该特别注意Id字段?

小智 1

与许多 POCO 一样,我的对象是可变的

但主键字段上的数据不应该是可变的。根据定义,或者无论如何,您以后都会处于痛苦数据库的世界中。

仅在主键的字段上生成哈希码。

Equals() 必须返回 true IFF 参与对象具有相同的哈希码

BZZZ - 错误。

哈希码是双的。2 个对象可能具有不同的值和 smae 哈希码。hsahsode 是一个 int (32 位)。一个字符串可以有 2GB 长。您无法将每个可能的字符串映射到单独的哈希码。

如果两个对象具有相同的哈希码,则它们可能不同。如果两个对象相同,则它们不能具有不同的哈希码。

您从哪里得到这样的想法:对于具有相同哈希码的对象,Equals 必须返回 true?

此外,无论是否存在 PCO,映射到数据库并在关系中使用的对象必须具有稳定的主键(可用于运行哈希码计算)。没有此 STIL 的对象应该有主键(根据 SQL Server 要求),这里使用序列/人工主键。再次使用它来运行 HashCode 计算。