我正在尝试使用NHibernate来映射每个子类继承结构的表,看起来像这样:
public class BaseClass
{
public virtual IColllection<BaseClassCollection> Collection { get; set; }
}
public class ChildClass : BaseClass
{
public new virtual ICollection<ChildClassCollection> Collection { get; set; }
}
当我尝试从会话中获取ChildClass时出现以下错误:
“无法转换类型为'NHibernate.Collection.Generic.PersistentGenericBag 1[BaseClassCollection]' to type 'System.Collections.Generic.ICollection
1 [ChildClassCollection]'的对象。”
这是我的映射文件:
<class name="BaseClass" table="BaseClassTable">
<bag name="Collection">
<key>
<column name="BaseClassCollectionId" />
</key>
<one-to-many class="BaseClassCollection" />
</bag>
<joined-subclass name="ChildClass" table="ChildClassTable">
<key>
<column name="BaseClassId" />
</key>
<bag name="Collection">
<key>
<column name="ChildClassCollectionId" />
</key>
<one-to-many class="ChildClassCollection" />
</bag>
</class>
在映射子类时,我需要一些覆盖基类中Collection属性类型的方法。 NHibernate有可能吗?
答案 0 :(得分:1)
我认为,只有这样才能实现这一目标:
public class BaseClass<TChild> where TChild : BaseClassCollection {
public virtual ICollection<TChild> Collection { get; set; }
}
public class ChildClass<TChild> : BaseClass<TChild> where TChild : ChildClassCollection {
public override ICollection<TChild> Collection { get; set; }
}
public class BaseClassCollection { }
public class ChildClassCollection : BaseClassCollection { }
问题是new
关键字会破坏继承,然后您的映射依赖于该继承。你真的应该避免在任何地方使用new
因为它不是一个好主意;将NHibernate从混合中取出,你会得到不同的行为,这取决于你如何选择你的课程;把它投射为BaseClass
,你会得到一些完全不同的东西,而不是把它当作ChildClass
投射。
如果这不是你要找的答案,我会道歉,但如果你需要使用new
关键字,我认为不可能让它运作。