如何为单个类层次结构获取单表继承

时间:2011-06-20 12:07:21

标签: nhibernate fluent-nhibernate automapping single-table-inheritance

我使用FluentNHibernate和AutoMapping来映射我的持久化类。 每个子类映射的默认表适用于几乎所有我的类层次结构,除了一个:这里我有一个抽象基类“A”,A具有所需的所有数据字段。子类“B”,“C”,......“X”仅在行为上有所不同。 “每班课程”会导致许多不受欢迎的表格 我想创建一个Override类来创建一个表A(我可以使用IncludeBaseClass Override执行此操作。但是如何设置Discriminator Override类,它还将所有子类放在此表中? 流利的文档表明如下:

public override bool IsDiscriminated(Type type)
{
    return type.In(typeof(ClassOne), typeof(ClassTwo));
}

我认为这样可以为我的情况做好准备:

public override bool IsDiscriminated(Type type)
{
    return (type == typeof(A));
}

但是将此方法放在哪个Override类中?

2 个答案:

答案 0 :(得分:1)

将此方法放在继承自DefaultAutomappingConfiguration的类中 也可能需要这样做:return (type == typeof(A) || type.IsSubclassOf(typeof(A));

答案 1 :(得分:0)

“IsDiscriminated”方法是“DefaultAutomappingConfiguration”类的一部分。 通过重写此类,您可以更改类的映射方式:

public class MyAutomappingConfiguration : DefaultAutomappingConfiguration
{
    public override bool ShouldMap(Type type)
    {
        return type.Namespace != null &&
               type.Namespace.Contains("Models");
    }

    public override bool IsDiscriminated(Type type)
    {
        return type == typeof(Code);
    }
}

注意:ShouldMap被覆盖,以及使用此配置类阻止在映射中使用“Where”子句 它传递给映射过程,如下所示:

  AutoMap.Assemblies(new MyAutoMappingConfig(), assembliesToMap.ToArray()).                 Conventions.AddFromAssemblyOf<BaseEntity>();