2012-01-04 2 views

답변

2

NHibernate는 내부 상태 추적 엔진에서 클래스의 기본 키 값을 사용하여 해당 인스턴스를 식별합니다.

도메인에 하나의 기본 키 속성이있을 때, NHibernate는 키 값으로 속성에 의해 반환 된 값을 사용하고 값에 GetHashcodeEquals을 호출하고 기본 키를 사용하여 Dictionary<TKey,TValue> 인스턴스.

복합 키를 형성하는 다수의 기본 키 속성이있을 때, NHibernate는 사용할 수있는 키 값을 얻는 간단한 방법이 없다. 두 인스턴스 간의 동등성을 결정하는 방법을 정의해야합니다. HashSet<T>에있는 것처럼 인스턴스를 효과적으로 자체 키로 변환해야합니다.

복합 키 값을 사용하기 위해 유형에 EqualsGetHashCode을 덮어 쓰지 않은 경우 데이터 모델에서 사용하는 "동일성"을 반영하지 않습니다 (동일한 기본 키가있는 경우 두 행이 동일 함) NHibernate는 올바른 엔티티를 추적하고 있는지 확신 할 수 없다. 이것이 예외가 발생하는 이유입니다.

복합 키의 개요와이를 다루는 영리한 방법에 대한 자세한 정보는 here을 참조하십시오.

+0

나는 본다. 뉴 햄프셔는 매핑을 사용하여 단일 기본 키의 속성을 찾고 이에 대한 코드를 가져옵니다. 이것은 단순한 유형이고 잘 정의 된 해시 코드를 가지고 있기 때문에 OK입니다. 그러나 복합 키에 대해 동일한 작업을 수행 할 수 없거나 "계산 된"해시 코드가 너무 약합니까? – Stig

+0

.. NH가 단일 기본 키를 처리하고 Equals/GetHashCode를 재정의하지 않은 경우 HashSet 을 어떻게 사용할 수 있습니까? – Stig

+0

NHibernate는 당신이 간단한 프라이 머리 키를 가질 때'Dictionary'를 사용하고, 키는 프라이 머리 키 값이고, 사용되는 복합 키가있을 때'HashSet'을 사용한다고 상상할 수 있습니다. NHibernate가 프라이 머리 키 값을 포함하는 내부 형을 생성 할 수 있지만, 현재는 그렇지 않다. –