当我的域模型在数据库中有一个复合键时,忘记覆盖Equals / GetHashCode时会出现异常
NHibernate.MappingException: composite-id class must override Equals():
为什么当我有非复合ID时,它不会给我同样的错误?
答案 0 :(得分:3)
NHibernate在其内部状态跟踪引擎中使用类的主键值来标识该实例。
当你的域中有一个主键属性时,NHibernate将使用属性返回的值作为键值,在值上调用GetHashcode
和Equals
,使用主键很多就像你在Dictionary<TKey,TValue>
实例中使用它一样。
当有多个主键属性形成复合键时,NHibernate没有简单的方法来获取它可以使用的键值。它要求您定义如何确定两个实例之间的相等性,从而有效地将实例转换为自己的键,就像在HashSet<T>
中一样。
如果您没有在类型上覆盖Equals
和GetHashCode
以使用复合键值,则它不会反映数据模型使用的“相等”(如果两行相等,则它们具有相同的主键)并且NHibernate无法确定它是否正在跟踪正确的实体;这就是异常发生的原因。
您可以找到复合键的概述以及有关处理它们的聪明方法的更多信息here。