【问题标题】:Fluent NHibernate - Mapping a multi level class hierarchyFluent NHibernate - 映射多级类层次结构
【发布时间】:2011-07-19 03:34:23
【问题描述】:

我有一个旧数据库,它使用每个类层次结构继承策略的表,该策略使用两个数据库列作为鉴别器,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 {}

来自如下数据:

|使用类型 |格式类型 | -------------------------- |动物 |狮子 | |动物 |羊肉 | |矿物 |空 | |蔬菜 |玫瑰 | |蔬菜 |卷心菜 |

我认为我可以使用 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 的原因。

【问题讨论】:

  • 我尝试使用聚合字符串作为鉴别器(例如“Animal|Lion”),但不幸的是,字符串连接在 SQL 中与供应商无关(请参阅stackoverflow.com/questions/3939809/…)。

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


【解决方案1】:

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

  • 为字符串连接生成一个storedProcedure,可以在每个DB-System中重新实现,并使用公式调用它

  • 使 classmap UnknownMap 数据库感知

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

【讨论】:

  • 看来您可能是对的。我已经考虑过使用大案例陈述,但它只会变得丑陋。移位和添加的整数鉴别器是另一个选项((usetype * 10000)+ formattype)。
  • @aboy021 好主意,在数据库中可读性较差,但更容易实现
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多