NHibernate,非复合ID和GetHashCode

时间:2012-01-04 15:00:07

标签: nhibernate gethashcode

当我的域模型在数据库中有一个复合键时,忘记覆盖Equals / GetHashCode时会出现异常

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

您可以找到复合键的概述以及有关处理它们的聪明方法的更多信息here