은 왜 나에게 때 같은 오류를 제공하지 않습니다 복합 ID가 아닌가요?NHibernate에, 비 복합 ID 및 GetHashCode
2
A
답변
2
NHibernate는 내부 상태 추적 엔진에서 클래스의 기본 키 값을 사용하여 해당 인스턴스를 식별합니다.
도메인에 하나의 기본 키 속성이있을 때, NHibernate는 키 값으로 속성에 의해 반환 된 값을 사용하고 값에 GetHashcode
및 Equals
을 호출하고 기본 키를 사용하여 Dictionary<TKey,TValue>
인스턴스.
복합 키를 형성하는 다수의 기본 키 속성이있을 때, NHibernate는 사용할 수있는 키 값을 얻는 간단한 방법이 없다. 두 인스턴스 간의 동등성을 결정하는 방법을 정의해야합니다. HashSet<T>
에있는 것처럼 인스턴스를 효과적으로 자체 키로 변환해야합니다.
복합 키 값을 사용하기 위해 유형에 Equals
및 GetHashCode
을 덮어 쓰지 않은 경우 데이터 모델에서 사용하는 "동일성"을 반영하지 않습니다 (동일한 기본 키가있는 경우 두 행이 동일 함) NHibernate는 올바른 엔티티를 추적하고 있는지 확신 할 수 없다. 이것이 예외가 발생하는 이유입니다.
복합 키의 개요와이를 다루는 영리한 방법에 대한 자세한 정보는 here을 참조하십시오.
나는 본다. 뉴 햄프셔는 매핑을 사용하여 단일 기본 키의 속성을 찾고 이에 대한 코드를 가져옵니다. 이것은 단순한 유형이고 잘 정의 된 해시 코드를 가지고 있기 때문에 OK입니다. 그러나 복합 키에 대해 동일한 작업을 수행 할 수 없거나 "계산 된"해시 코드가 너무 약합니까? – Stig
.. NH가 단일 기본 키를 처리하고 Equals/GetHashCode를 재정의하지 않은 경우 HashSet을 어떻게 사용할 수 있습니까? –
Stig
NHibernate는 당신이 간단한 프라이 머리 키를 가질 때'Dictionary'를 사용하고, 키는 프라이 머리 키 값이고, 사용되는 복합 키가있을 때'HashSet'을 사용한다고 상상할 수 있습니다. NHibernate가 프라이 머리 키 값을 포함하는 내부 형을 생성 할 수 있지만, 현재는 그렇지 않다. –