2017-01-23 4 views
2

"Cells"테이블, "Division"테이블 및 이들 사이에 테이블을 결합한다고 가정합니다. 또한 매핑해야하는 "CellsView"(현재 사용자 권한에 따라 셀을 표시 할 수 있음)가 있기 때문에 "Cells"테이블을 매핑 할 수 없습니다.Fluent NHibernate - 의존성 중 하나가 존재하지 않으면 엔티티를 반환하지 않음

다음은 Division이있을 수 있습니다. 하나의 셀에 할당되었지만 현재 사용자는 셀을 나열하고 싶지 않습니다. 부서 목록을 검색하는 동안 사용자가 ID가 "1"인 셀이 존재하지 않는다는 예외가 발생합니다. (ID가 정확하고 셀은 있지만 뷰는 해당 셀을 표시 할 수 없습니다.)

Division 목록에서 예외가 발생하는 것을 방지하려면 (지연로드가 사용 가능) ** 예외를 throw하는 분할을 표시하는 방법 * *?

OnPreLoad 이벤트 및 OnPostLoad 이벤트 에서 현재 엔티티를 null로 만들려고했지만 셀 엔티티를 확인할 수 없지만 작동하지 않습니다. 모든 디비전 엔티티가 반환되며이를 읽는 동안 유창하게 Cell을 해결하려고 시도하고 예외가 throw됩니다.

그 CellViewView 연결은 응용 프로그램 내부의 여러 위치에서 사용되므로 PostLoad 이벤트와 같은 일반적인 솔루션은 전 세계적으로 처리하기에 좋습니다.

답변

1

나는 Fluent를 사용하지 않지만 what .hbm.xml mappings can do이 중복되면 컬렉션에 필터를 정의하고 적용 할 수 있어야합니다. 이렇게하면 귀하의 사건을 처리 할 수 ​​있습니다.

필터를 사용하면 개체 컬렉션의 요소에 대한 매개 변수화 된 제한을 정의 할 수 있습니다. 세션을 열면 필터를 매개 변수화하고 활성화 할 수 있습니다. 여기서 사용자는 사용자를 알아야합니다.

실제로 필터는 매핑 외부에서 정의 될 수 있으므로 Fluent가 필터를 처리하지 않아도 필터를 사용할 수 있어야합니다. Nhibernate reference documentation에서

예 : 댓글 후

ICollection<Cat> blackKittens = session.CreateFilter(
    pk.Kittens, "where this.Color = ?", Color.Black, NHibernateUtil.Enum(typeof(Color)) 
).List<Cat>(); 

자세한 내용 :

필터가 너무 하위 엔티티를 탐색 할 수 있어야한다. 그러나 귀하의 경우가 약간 악의적 인 경우 (외래 키가 정의되었지만 외국 엔티티는 발견되지 않음), 하위 엔터티의 nullable 속성을 테스트해야하지만 기본 키는 테스트하지 않아야합니다. (그렇지 않으면 NHibenate은 매우 가능성이 부모 외래 키에서 테스트하여 단순화됩니다.) 이것은 SQL로 번역 할 것이다 예외없이 실행되어야하고 액세스 할 수없는 부서를 필터링 할

"where this.Cell.SomeNonNullableProperty is not null" 

.

그런데 Division 목록에 명시 적으로 쿼리하는 경우 필터를 사용하면 답변이되지 않을 수 있습니다. (그들을 콜렉션으로 참조하는 엔티티를 통해 얻지는 않습니다.) 그런 경우 단순히 위의 조건을 쿼리에 직접 사용하십시오.

예외 만 해결하려면 not-found="ignore|exception" 옵션이 many-to-one 인 매핑을 지정해야합니다. 하지만 게으른로드로 잘 작동하는지 확신 할 수 없지만 결코 시도하지 않았습니다. (이 옵션이 유창하게 제공되는지 여부는 알 수 없습니다.)

+0

필터 아이디어는 좋지만 특정 값 (예 : 검은 고양이)으로 필터링하고 싶지 않지만 하위 유형이 존재하는 경우 (고양이는 "남성"유형 임)이 유형이 올바르게 작동하는지 확인하고 싶습니다 타입이 에러를 발생 시키면로드되거나 전체 cat을 반환하지 않습니다. (나는 IsInitialized를 사용하고 싶다). 가능하다고 생각하십니까? –

+0

자세한 내용을 추가했습니다. –