NHibernate、非复合ID和GetHashCode

NHibernate、非复合ID和GetHashCode,nhibernate,gethashcode,Nhibernate,Gethashcode,当我的域模型在数据库中有一个复合键时,当忘记重写Equals/GetHashCode时,我会得到一个异常 NHibernate.MappingException: composite-id class must override Equals(): 当我有一个非复合ID时,为什么它不给我相同的错误?NHibernate在其内部状态跟踪引擎中使用类的主键值来标识该实例 当您的域中有一个主键属性时,NHibernate将使用该属性返回的值作为键值,对该值调用GetHashcode和Equals,使

当我的域模型在数据库中有一个复合键时,当忘记重写Equals/GetHashCode时,我会得到一个异常

NHibernate.MappingException: composite-id class must override Equals():

当我有一个非复合ID时,为什么它不给我相同的错误?

NHibernate在其内部状态跟踪引擎中使用类的主键值来标识该实例

当您的域中有一个主键属性时,NHibernate将使用该属性返回的值作为键值,对该值调用
GetHashcode
Equals
,使用主键就像在
字典
实例中使用它一样

当有多个主键属性组成一个复合键时,NHibernate没有简单的方法来获取它可以使用的键值。它要求您定义如何确定两个实例之间的相等性,有效地将实例转换为自己的键,就像在
哈希集中一样

如果您没有在您的类型上覆盖
Equals
GetHashCode
以使用复合键值,则它不会反映数据模型使用的“相等”(如果两行具有相同的主键,则两行相等),并且NHibernate无法确定它正在跟踪正确的实体;这就是发生异常的原因


您可以找到组合键的概述,以及有关处理组合键的巧妙方法的更多信息。

我明白了。NH使用映射查找单个主键的属性,并获取该主键的hascode。这是可以的,因为它是一个简单的类型,并且有一个定义良好的哈希代码。但是,它不能对复合键执行相同的操作,或者“计算”哈希代码会太弱吗?。。NH在处理单个主键和Equals/GetHashCode未被覆盖时如何使用HashSet?您可以想象,当您有一个简单的主键时,NHibernate使用一个
字典
,其中键是主键值,当使用一个复合键时,NHibernate使用一个
HashSet
。NHibernate可能会创建一个包含主键值的内部类型,但目前没有。这就是我的观点。如果它对一个简单的主键使用字典,为什么不对复合键执行相同的操作,这样我们就不需要编写equals/HashCodeOk,但您必须表示某种确定相等性和哈希代码的方法;NHibernate可以根据所使用的类型来尝试和猜测一种方法,但是如果没有某种配置,就没有万无一失的方法来处理这种情况。NHibernate通过
Equals
GetHashCode
的自定义实现获得该“配置”。