Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fluent NHibernate-映射多级类层次结构_Nhibernate_Fluent Nhibernate_Nhibernate Mapping_Subclass_Subclassing - Fatal编程技术网

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

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

我有一个遗留数据库,它使用一个表/类层次结构继承策略,使用两个数据库列作为鉴别器,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 | |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这个主意不错,在数据库中可读性较差,但更容易实现