Fluent NHibernate - 映射多级类层次结构

时间:2011-07-19 03:34:24

标签: nhibernate fluent-nhibernate nhibernate-mapping subclass subclassing

我有一个遗留数据库,它使用每个类层次结构继承策略的表,它使用两个数据库列作为鉴别器,usetype和formattype。 UseType为您提供顶级,formattype为第二个。

基本上我希望能够填充类层次结构,如:

public abstract class Unknown {}

public abstract class Animal : Unknown { }
public class Lion : Animal {}
public class Lamb : Animal {}

public class Mineral : Unknown { }

public abstract class Vegetable : Unknown {}

public class Rose : Vegetable { }
public class Cabbage : Vegetable {}

来自以下数据:

| UseType   | FormatType |
--------------------------
| Animal    | Lion       |
| Animal    | Lamb       |
| Mineral   | null       |
| Vegetable | Rose       |
| Vegetable | Cabbage    |

我以为我可以使用Fluent映射,例如:

public sealed class UnknownMap : ClassMap<Unknown>
{
    public UnknownMap()
    {
        DiscriminateSubClassesOnColumn("UseType");
    }
}

public sealed class AnimalMap : SubclassMap<Animal>
{
    public AnimalMap()
    {
        DiscriminatorValue("Animal");
        DiscriminateSubClassesOnColumn("FormatType");
    }
}

public sealed class LionMap : SubclassMap<Lion>
{
    public LionMap()
    {
        DiscriminatorValue("Lion");
    }
}

public sealed class LambMap : SubclassMap<Lamb>
{
    public LambMap()
    {
        DiscriminatorValue("Lamb");
    }
}

public sealed class MineralMap : SubclassMap<Mineral>
{
    public MineralMap()
    {
        DiscriminatorValue("Mineral");
    }
}

public sealed class VegetableMap : SubclassMap<Vegetable>
{
    public VegetableMap()
    {
        DiscriminatorValue("Vegetable");
        DiscriminateSubClassesOnColumn("FormatType");
    }
}


public sealed class RoseMap : SubclassMap<Rose>
{
    public RoseMap()
    {
        DiscriminatorValue("Rose");
    }
}

public sealed class CabbageMap : SubclassMap<Cabbage>
{
    public CabbageMap()
    {
        DiscriminatorValue("Cabbage");
    }
}

但遗憾的是,SubclassMap不支持DiscriminateSubClassesOnColumn。

根据Fluent NHibernate Wiki,通过使用自定义sql语句支持多列标识符。

不幸的是,我必须支持相当多的子类,我更喜欢使用用代码编译的东西。毕竟,这就是我首先使用Fluent NHibernate的原因。

1 个答案:

答案 0 :(得分:1)

我想到了两个使用字符串连接的选项:

  • 为stringconcatenation生成一个storedProcedure,可以在每个DB-System中重新实现并使用公式来调用它

  • 使类图UnknownMap数据库识别

    public UnknownMap()
    {
        string formula;
        switch (Configuration.GetDbType())
        {
            case DBType.SQLServer:
                formula = "GROUP_CONCAT(UseType, FormatType´)";
                break;
            ...
        }
    
        DiscriminateSubClassesOnColumn("")
            .Formula(formula);
    }