2
当我的域模型在数据库中的复合键我会忘记重载Equals当异常/ GetHashCode的NHibernate的,非复合ID和GetHashCode
NHibernate.MappingException: composite-id class must override Equals():
为什么它不给我,当同样的错误我有一个非复合ID?
当我的域模型在数据库中的复合键我会忘记重载Equals当异常/ GetHashCode的NHibernate的,非复合ID和GetHashCode
NHibernate.MappingException: composite-id class must override Equals():
为什么它不给我,当同样的错误我有一个非复合ID?
NHibernate在其内部状态跟踪引擎中使用您的类的主键值来标识该实例。
当你在你的域中有一个主键属性时,NHibernate将使用该属性返回的值作为键值,使用主键调用GetHashcode
和Equals
,就像使用主键一样Dictionary<TKey,TValue>
实例。
当有多个主键属性组成一个组合键时,NHibernate没有无用的方法来获得它可以使用的键值。它要求您定义如何确定两个实例之间的相等性,从而有效地将实例转换为其自己的密钥,就像在HashSet<T>
中那样。
如果你还没有在你的类型使用您的复合键值覆盖Equals
和GetHashCode
,它不反映在数据模型中使用的“平等”(两行相等如果他们有相同的主键) NHibernate不能确定它正在跟踪正确的实体;这就是发生异常的原因。
你可以找到组合键的概述和更多巧妙处理它们的信息here。
我明白了。 NH使用映射为单个主键查找属性并获取hascode。这是可以的,因为它是一个简单的类型并且有一个明确定义的散列码。但是它不能'对组合键执行相同的操作,或者“计算”的哈希码太弱? – Stig 2012-01-04 15:24:03
..以及NH如何在处理单个主键时使用HashSet并且Equals/GetHashCode没有被覆盖? –
Stig
2012-01-04 15:26:13
你可以想象当你有一个简单的主键时,NHibernate使用'Dictionary',键是主键值,当有一个组合键时使用'HashSet'。 NHibernate可能会创建一个内部类型来包含主键值,但目前它不会。 – 2012-01-04 16:17:44