Nhibernate 如何将继承映射到子类

Nhibernate 如何将继承映射到子类,nhibernate,inheritance,mapping,subclass,Nhibernate,Inheritance,Mapping,Subclass,我有一个不是抽象的基类和两个基于这个类的类,但是它们在计算结果时有不同的实现。基类还继承自一个抽象类,该抽象类在系统中的许多不同位置共享,因此我无法真正更改该抽象类 我知道我可以提取一个所有三个继承自的基类,并使用子类的普通映射,但我只想知道是否有可能创建一个映射此场景的hbm文件 class BaseClass : CalculationBaseClass { public virtual int Calculate() { ... } } class Speci

我有一个不是抽象的基类和两个基于这个类的类,但是它们在计算结果时有不同的实现。基类还继承自一个抽象类,该抽象类在系统中的许多不同位置共享,因此我无法真正更改该抽象类

我知道我可以提取一个所有三个继承自的基类,并使用子类的普通映射,但我只想知道是否有可能创建一个映射此场景的hbm文件

class BaseClass : CalculationBaseClass
{
   public virtual int Calculate()
   {
     ...
   }
}

class SpecializedClass : BaseClass
{
   public override int Calculate()
   {
      ...
   }
}

class HistoricClass : BaseClass
{
   public override int Calculate()
   {
      ...
   }
}
来自NHibernate:

NHibernate支持三种基本的继承映射策略

  • 每个类层次结构的表

  • 每个子类的表

  • 每种混凝土等级的表

您可以根据当前表结构选择其中一种策略,或者如果您没有遗留模式,则可以选择最适合对象模型的策略(例如,基于映射属性)。在您的情况下,如果使用“每个类的表层次结构”,您将得到如下映射:

<class name="CalculationBaseClass" table="MyTable">
    <id name="Id" type="Int64" column="ID">
        <generator class="native"/>
    </id>
    <discriminator column="TYPE" type="String"/>

    <subclass name="BaseClass" discriminator-value="BASE">
        ...
    </subclass>
    <subclass name="SpecializedClass" discriminator-value="SPECIALIZED">
        ...
    </subclass>
    <subclass name="HistoricClass " discriminator-value="HISTORIC">
        ...
    </subclass>
</class>

...
...
...

无法100%确定您要实现的目标-能否指定希望表结构的外观?