Fluent NHibernate-映射多级类层次结构
我有一个遗留数据库,它使用一个表/类层次结构继承策略,使用两个数据库列作为鉴别器,usetype和formattype。UseType为您提供顶级,formattype为第二级 基本上,我希望能够填充类层次结构,如:Fluent NHibernate-映射多级类层次结构,nhibernate,fluent-nhibernate,nhibernate-mapping,subclass,subclassing,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 {} pub
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 |
|UseType | FormatType|
--------------------------
|动物狮子|
|动物羔羊|
|矿物|空|
|蔬菜玫瑰|
|蔬菜白菜|
我想我可以使用流畅的映射,如:
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");
}
}
公共密封类未知映射:类映射
{
公共未知映射()
{
区分子类子列(“使用类型”);
}
}
公共密封类AnimalMap:子类映射,通过使用自定义sql语句支持多列鉴别器
不幸的是,我必须支持相当多的子类,而且我更喜欢使用用代码编译的东西。毕竟,这就是我首先使用Fluent NHibernate的原因。2我想到了使用字符串连接的选项:
- 为stringconcatenation生成一个storedProcedure,它可以在每个DB系统中重新实现,并使用公式调用它
- 使classmap
UnknownMap
数据库感知
public UnknownMap()
{
string formula;
switch (Configuration.GetDbType())
{
case DBType.SQLServer:
formula = "GROUP_CONCAT(UseType, FormatType´)";
break;
...
}
DiscriminateSubClassesOnColumn("")
.Formula(formula);
}
2我想到了使用字符串连接的选项:
- 为stringconcatenation生成一个storedProcedure,它可以在每个DB系统中重新实现,并使用公式调用它
- 使classmap
UnknownMap
数据库感知
public UnknownMap()
{
string formula;
switch (Configuration.GetDbType())
{
case DBType.SQLServer:
formula = "GROUP_CONCAT(UseType, FormatType´)";
break;
...
}
DiscriminateSubClassesOnColumn("")
.Formula(formula);
}
我曾尝试将聚合字符串用于鉴别器(例如“Animal | Lion”),但不幸的是,字符串连接在SQL中并不与供应商无关(请参阅)。我曾尝试将聚合字符串用于鉴别器(例如“Animal | Lion”),但不幸的是,字符串连接在SQL中不与供应商无关(请参阅)。看起来您可能是对的。我已经考虑过使用一个大的案例陈述,但它只是会变得丑陋。位移位并添加的整数鉴别器是另一个选项((usetype*10000)+formattype)。@aboy021这个主意不错,在数据库中可读性较差,但更容易实现。看起来您可能是对的。我已经考虑过使用一个大的案例陈述,但它只是会变得丑陋。位移位并添加的整数鉴别器是另一个选项((usetype*10000)+formattype)。@aboy021这个主意不错,在数据库中可读性较差,但更容易实现