FluentNHiberante union-subclass映射不会为基类生成表

时间:2014-11-15 23:25:54

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我正在尝试使用union-subclass策略和FluentNHibernate映射以下域模型。以下是我的类的外观(删除了不需要的部分)

public class Benefit
{
}
public class Leave : Benefit
{
}
public class SeasonTicketLoan : Benefit
{
}

这是我的映射代码

public class BenefitMappings : ClassMap<Benefit>
{
    public BenefitMappings()
    {
        UseUnionSubclassForInheritanceMapping();
    }         
}

public class LeaveMappings : SubclassMap<Leave>
{
}

public class SeasonTicketLoanMappings : SubclassMap<SeasonTicketLoan>
{
}

当我使用SchemaExport为上述映射生成数据库脚本时,我得到Leave的表格和SeasonTicketLoan的另一个表格,但Benefit没有。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:2)

  

......我在这里遗漏了什么吗?

是的,您正在使用映射每个具体类别表(TPC),这是用于创建

  • 每个班级单独的表格和
  • 没有父母的表格。

要获得真正深刻而清晰的理解,您应该阅读这篇全面的文章:

Inheritance mapping strategies in Fluent Nhibernate

你可以在哪里阅读:

  

每个混凝土类别表(TPC)

     

在TPC继承中,继承层次结构中的每个类都有自己的表。继承层次结构掩盖了这样一个事实:有几个独立的基础表代表每个子类型。

代码段摘录:

// mapping of the  TPCBaseEntity base class
public class TPCBaseEntityMap : ClassMap<TPCBaseEntity>
{
    public TPCBaseEntityMap()
    {
          // indicates that this class is the base
          // one for the TPC inheritance strategy and that 
          // the values of its properties should
          // be united with the values of derived classes
          UseUnionSubclassForInheritanceMapping();

如果我们希望每个基类都有表格,我们需要:

每种类型的表(TPT)

  

TPT是数据库中描述的具有单独表的继承。每个表都提供了其他详细信息,这些详细信息描述了基于另一个表的新类型,该表是该表的父级。

再次提供一些映射片段摘录:

// mapping of the TPTAnimal base class
public class TPTAnimalMap : ClassMap<TPTAnimal>
{
    public TPTAnimalMap()
    {
          // the name of the schema that stores the table corresponding to the type 
          Schema("dbo");
          // the name of the table corresponding to the type
          Table("TPT_Animal");

...
// mapping of the TPTHorse class 
public class TPTHorseMap : SubclassMap<TPTHorse>
{
    public TPTHorseMap()
    {
          // the name of the schema that stores the table corresponding to the type 
          Schema("dbo");
          // the name of the table corresponding to the type
          Table("TPT_Horse");