2012-01-04 71 views
2

当我的域模型在数据库中的复合键我会忘记重载Equals当异常/ GetHashCode的NHibernate的,非复合ID和GetHashCode

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

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

回答

2

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

当你在你的域中有一个主键属性时,NHibernate将使用该属性返回的值作为键值,使用主键调用GetHashcodeEquals,就像使用主键一样Dictionary<TKey,TValue>实例。

当有多个主键属性组成一个组合键时,NHibernate没有无用的方法来获得它可以使用的键值。它要求您定义如何确定两个实例之间的相等性,从而有效地将实例转换为其自己的密钥,就像在HashSet<T>中那样。

如果你还没有在你的类型使用您的复合键值覆盖EqualsGetHashCode,它不反映在数据模型中使用的“平等”(两行相等如果他们有相同的主键) NHibernate不能确定它正在跟踪正确的实体;这就是发生异常的原因。

你可以找到组合键的概述和更多巧妙处理它们的信息here

+0

我明白了。 NH使用映射为单个主键查找属性并获取hascode。这是可以的,因为它是一个简单的类型并且有一个明确定义的散列码。但是它不能'对组合键执行相同的操作,或者“计​​算”的哈希码太弱? – Stig 2012-01-04 15:24:03

+0

..以及NH如何在处理单个主键时使用HashSet 并且Equals/GetHashCode没有被覆盖? – Stig 2012-01-04 15:26:13

+0

你可以想象当你有一个简单的主键时,NHibernate使用'Dictionary',键是主键值,当有一个组合键时使用'HashSet'。 NHibernate可能会创建一个内部类型来包含主键值,但目前它不会。 – 2012-01-04 16:17:44