我有一个遗留数据库,它使用每个类层次结构继承策略的表,它使用两个数据库列作为鉴别器,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的原因。
答案 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);
}