2010-06-02 2 views
1

오늘 흥미로운 문제가 있습니다 !! 기본적으로 두 클래스가 있습니다.유창한 nhibenate 매핑 문제

public class A : B 
{ 
    public virtual new ISet<DifferentItem> Items {get;set;} 
} 

public class B 
{ 
    public virtual int Id {get;set;} 
    public virtual ISet<Item> Items {get;set;} 
} 

하위 클래스 A는 기본 클래스 B 속성 인 Items를 숨기고 동일한 이름과 다른 유형의 새 속성으로 바꿉니다. 이러한 클래스에 대한

매핑이

public class AMapping : SubclassMap<A> 
{ 
    public AMapping() 
    { 
    HasMany(x=>x.Items) 
     .LazyLoad() 
     .AsSet(); 
    } 
} 

public class BMapping : ClassMap<B> 
{ 
    public BMapping() 
    { 
    Id(x=>x.Id); 

     HasMany(x=>x.Items) 
     .LazyLoad() 
     .AsSet(); 
    } 
} 

있습니다 그러나 나는 다음과 같은 예외가 얻을지도 확인하기 위해 내 단위 테스트를 실행하면

이 매핑을 테스트 : NHibernate.PropertyAccessException : 잘못된 주조 (속성 유형 불일치에 대한 매핑 확인); setter of A ----> System.InvalidCastException : 형식이 'NHibernate.Collection.Generic.PersistentGenericSet 1[Item]' to type 'Iesi.Collections.Generic.ISet 1 [DifferentItem]'유형의 개체를 캐스팅 할 수 없습니다.

누구든지 아이디어가 있습니까?

분명히 하위 클래스의 컬렉션 유형과 관련이 있습니다. 그러나 매핑 클래스에서 사용할 수있는 옵션을 살펴 보았습니다. 여기서는 해결책이 아닌 것으로 눈에 띄지 않았습니다.

+0

매핑을 확인하기 위해 PersistenceSpecification을 사용하고 있습니다. –

+0

Skeets C#의 p103을 깊이 읽은 후에 "공분산 및 반항성의 부족"과 관련이있는 것 같습니다. –

답변

1

C#의 제네릭은 공분산을 지원하지 않으므로 기본적으로 ISet<Item>ISet<DifferentItem>을 가질 수 없습니다. 언어의 한계이기 때문에 디자인을 재고해야합니다. 또는 C# 6까지 기다리십시오.

관련 문제