NHibernate:每子类映射表和新关键字

时间:2010-01-29 02:02:47

标签: c# nhibernate inheritance

我正在尝试使用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有可能吗?

1 个答案:

答案 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关键字,我认为不可能让它运作。