gpt4 book ai didi

nhibernate:实现平等的最佳实践是什么?

转载 作者:行者123 更新时间:2023-12-04 10:32:07 25 4
gpt4 key购买 nike

我认为实体应该默认通过主键比较来实现相等,但是 nhibernate 文档建议使用业务标识:

The most obvious way is to implement Equals()/GetHashCode() by comparing the identifier value of both objects. If the value is the same, both must be the same database row, they are therefore equal (if both are added to an ISet, we will only have one element in the ISet). Unfortunately, we can't use that approach. NHibernate will only assign identifier values to objects that are persistent, a newly created instance will not have any identifier value! We recommend implementing Equals() and GetHashCode() using Business key equality.

Business key equality means that the Equals() method compares only the properties that form the business key, a key that would identify our instance in the real world (a natural candidate key)



和示例(也来自文档):
public override bool Equals(object other)
{
if (this == other) return true;

Cat cat = other as Cat;
if (cat == null) return false; // null or not a cat

if (Name != cat.Name) return false;
if (!Birthday.Equals(cat.Birthday)) return false;

return true;
}

这让我头晕目眩,因为业务标识的概念(根据示例)与语法比较相同,这基本上是我与 ValueObjects 关联的语义类型。不使用数据库主键作为比较值的原因是因为如果主键不是在客户端生成(例如增量)并且您使用某种哈希表集合(例如 ISet),这将更改对象的哈希码用于存储您的实体。

如何创建一个不违反相等/哈希码( http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx )的一般规则并且也符合 nhibernate 规则的良好的相等实现?

最佳答案

这是 ORM 的一个已知问题。在这里,我概述了我所知道的解决方案并给出了一些建议。

1 代理/主键:自动生成

正如您所提到的,如果对象尚未保存,则这不起作用。

2 代理/主键:赋值

您可以决定在代码中分配 PK 的值,这样对象总是有一个 ID 并且可以用于比较。见 Don't let hibernate steal your identity .

3 自然键

如果对象有另一个自然键,而不是主键,你可以使用这个。客户端实体就是这种情况,它有一个数字主键和一个字符串客户端编号。客户编号识别现实世界中的客户,是一个不会改变的自然 key 。

4 对象值

使用对象值进行相等是可能的。但是还有你提到的其他缺点。如果值发生变化并且对象在 中,这可能会出现问题。收藏 .例如,如果您有一个 Set有两个最初不同的对象,但是当它们在集合中被引用时,你改变了它们的值,使它们变得相等。那么你就违约了Set .见 Hibernate equals and hashcode .

5 混合:值 + 自动生成主键/代理键

如果要比较的对象已有 ID,请使用它。否则,使用对象值进行比较。

都有一些优点和缺点。恕我直言,最好是 3,如果您的域模型可能的话。否则,我使用了 5 并且它有效,尽管在使用集合时仍然存在一些陷阱。我从未使用过 2 但这听起来也是一个明智的解决方案,如果您找到一种在代码中生成 PK 的方法。也许其他人对此有指示。

关于nhibernate:实现平等的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2100226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com