今天我有一个有趣的问题!!基本上我有两节课。
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();
}
}
但是,当我运行单元测试来检查映射时,我得到以下异常:
测试A映射:NHibernate.PropertyAccessException:Invalid Cast(检查映射是否存在属性类型不匹配);安装者
----&GT; System.InvalidCastException:无法转换类型为'NHibernate.Collection.Generic.PersistentGenericSet 1[Item]' to type 'Iesi.Collections.Generic.ISet
1 [DifferentItem]'的对象。
有人有什么想法吗?
显然,它与子类上的集合类型有关。但是我浏览了映射类中的可用选项,没有什么能在这里成为解决方案。
答案 0 :(得分:1)
c#中的泛型不支持协方差,因此基本上您不能拥有ISet<Item>
和ISet<DifferentItem>
。由于这是语言的限制,您需要重新考虑您的设计。或者等到#6。