nhibernate가 Ilist 프록시를 생성하는지 확인하려면 어떻게해야합니까?
-
19-09-2019 - |
문제
내 도메인 객체에 다음과 같이 노출되는 속성이 있습니다.
public virtual IEnumerable<WorkPost> WorkPosts
{
get { return sheetPosts; }
private set
{
Guard.AssertAssignableFrom(value, typeof (IList<WorkPost>));
sheetPosts = value as IList<WorkPost>;
}
}
내부 표현은 IList<WorkPost>
보시다시피, 할당 된 값 (nhibernate에서 나오는 게으른로드 프록시)이 올바른 유형으로 캐스팅됩니다. 이 구현은 Nhibernate 프록시의 내부 표현에 의존하기 때문에 내 입안에서 나에게 나쁜 맛을 주었다. nhibernate가 프록시를 목록으로 생성하는지 확인하기 위해 AsList()
선언:
HasMany(sheet => sheet.WorkPosts).KeyColumn("sheetId").AsList();
그러나 이것은 목록 시맨틱이 데이터베이스 모델에 몇 가지 추가 필드를 추가하고 추가 쿼리 (커밋시 정렬 필드의 업데이트로 인해)를 다시 추가하는 정렬을 암시하기 때문에 요청한 것보다 조금 더 많은 것을 주었다. 토고.
프록시를 생성 할 때 어떤 유형의 인터페이스를 반환 해야하는지 어떻게 제어 할 수 있습니까? (참고 : 변경 IEnumerable
속성의 반환 유형은 내가 찾고있는 답이 아닙니다 :-))
해결책
의미론을 정렬하지 않으려면 중복 요소를 허용하는지 여부에 따라 세트 나 백을 사용해야합니다. 여기에 있습니다 컬렉션에 대한 문서 더 많은 정보를 위해서.
nhibernate는 컬렉션의 의미에서 매우 엄격합니다.
- 목록 (지속됩니다
IList
)는 복제를 허용하고 정수로 색인화 할 수있는 정렬 된 컬렉션입니다. - 지도 (지속됩니다
IDictionary
)는 주어진 유형의 고유 키로 인덱싱 된 변형되지 않은 컬렉션입니다. - 세트 (지속됩니다
ISet
IESI.Collections에서 아마도 사용될 것입니다ISet
이는 프레임 워크의 버전 4와 함께 제공)는 중복을 허용하지 않는 변환되지 않은 컬렉션입니다. - 가방 (지속됩니다
ICollection
또는IList
그러나 인덱싱 보장은 제공하지 않습니다)는 중복을 허용하는 변하지 않는 컬렉션입니다.
제휴하지 않습니다 StackOverflow