2012-05-21 3 views
3

NHibernate로 매핑 한 데이터베이스 뷰 중 하나와 이상한 문제가있는 것 같습니다. 내가 매핑 한 뷰 중 하나에 대해 중복 레코드가 나타납니다. 나는 다음과 같은 뷰가NHibernate 뷰에서 쿼리가 중복 레코드를 반환합니다.

     WorkDetailView 
        /  \ 
        /   \ 
        /   \ 
        /    \ 
      PickWorkDetailView PutWorkDetailView 

각 개체가 다른 데이터베이스에 볼 수는 있지만를 나타내는 객체가 모두 PickWorkDetailViewWorkDetailView에서 PutWorkDetailView 상속는 같은 분야의 많은 것을 공유하고 있기 때문이다.

다음 코드를 실행하면 2 결과가 나오지만 SQL Management Studio에서 실제 데이터베이스보기를 실행하면 1 결과가납니다.

List<WorkDetailView> workList = session.QueryOver<WorkDetailView>() 
             .List<WorkDetailView>().ToList(); 

흥미로운 부분은 내가 workList 컬렉션의 모든 항목을 볼 때 내가 한 WorkDetailView 객체와 하나 개 PickWorkDetailView 객체를 참조 이상이다. 또한 NHibernate가 실행중인 질의를 살펴보면 3 개의 뷰 (WorkDetailView, PickWorkDetailView 및 PutWorkDetailView)에서 이슈를 선택합니다. 이것은 전혀 소리가 나지 않습니다. 필요하다면 xml 매핑이나 유창한 매핑을 게시 할 수 있습니다.

답변

5

NHibernate는 다형성 쿼리를 지원합니다. 따라서 기본 클래스를 쿼리하면 해당 클래스에서 파생 된 모든 객체가 검색됩니다.

클래스 매핑에서 polymorphism attribute을 사용하여이 동작을 제어 할 수 있습니다.

암시 적 다형성은 클래스의 인스턴스 가 그 명칭 질의에 의해 리턴 될 클래스의 모든 서브 클래스의 인스턴스의 이름을 수퍼 클래스 또는 구현 인터페이스 또는 클래스를 조회함으로써 것을 반환되는 것을 의미 클래스 그 자체. 명시 적 다형성 해당 클래스의 인스턴스가 명시 적으로 클래스 이름을 쿼리 할 경우에만 반환되며, 클래스의 이름을 쿼리 서브 클래스의 반환 인스턴스 만이 <subclass> 또는 <joined-subclass> A와이 <class> 선언 내에 매핑된다는 것을 의미합니다. 대부분의 경우 기본값 인 polymorphism="implicit"이 적합합니다. 명시 적 다형성은 두 개의 다른 클래스가 동일한 테이블에 매핑 될 때 유용합니다. 이렇게하면 테이블 열의 하위 집합 을 포함하는 "가벼운"클래스가 허용됩니다.

예제에서 polymorphism="explicit"을 3 가지 매핑 모두에 설정할 수 있습니다.

+0

감사합니다. @ dotjoe. 이것은 바로 그 것이었다. 나는 NHibernate 문서에서 그 중 하나를 놓쳤다는 것에 놀랐다. Fluent NH를 사용하는 분들은 ClassMap에 다음과 같은 진술 만하면됩니다 :'Polymorphism.Explicit();' –

+0

정말 고맙습니다. – hikalkan

+0

내 경우에도 필요한 대답뿐입니다. 매우 감사. –

관련 문제