Fluent nhibernate Fluent NHibernate自动映射类约定是';t应用于整个类层次结构

Fluent nhibernate Fluent NHibernate自动映射类约定是';t应用于整个类层次结构,fluent-nhibernate,automapping,convention-over-configur,table-per-subclass,Fluent Nhibernate,Automapping,Convention Over Configur,Table Per Subclass,我正在尝试用Fluent Nhibernate自动映射一个简单的继承层次结构,并且我需要为每个表使用与其类稍有不同的名称(下划线而不是Pascal大小写)。这似乎是一个使用约定的明显地方。我还想使用每个子类的表策略,但这种组合似乎给我带来了一个问题:约定只应用于层次结构的基类 这是我的自动映射: AutoMap .AssemblyOf<BaseRule>() .IncludeBase<BaseRule>() // "BaseRule" is an abst

我正在尝试用Fluent Nhibernate自动映射一个简单的继承层次结构,并且我需要为每个表使用与其类稍有不同的名称(下划线而不是Pascal大小写)。这似乎是一个使用约定的明显地方。我还想使用每个子类的表策略,但这种组合似乎给我带来了一个问题:约定只应用于层次结构的基类

这是我的自动映射:

AutoMap
    .AssemblyOf<BaseRule>()
    .IncludeBase<BaseRule>() // "BaseRule" is an abstract class
    .Conventions.Add( DefaultCascade.All() )
    .Conventions.Add<OracleTableNameConvention>()
我得到的是:

  BaseRule -> Base_Rule
  NumberRule -> NumberRule
  PatternStringRule -> PatternStringRule
如您所见,实际上只有基类被更改。以下是我现有的约定,以便您了解我是如何定义它的:

public class OracleTableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        string fixedName = instance.EntityType.Name.ToUnderscoredNaming();
        instance.Table(fixedName);
    }
}
我还研究了
ISubclassConvention
接口,没有办法调整表的名称(这很有道理,子类并不总是在它们自己的表中)

如果我从自动映射中删除
IncludeBase
行,名称将成为我想要的名称,只是它将成为每个具体类的表。我希望使用每个子类的表,将所有公共数据保留在一个共享的基表中

我可以为每个名称添加覆盖,如果有必要,我也会添加覆盖,但我宁愿不添加


似乎这应该是一种明显受支持的行为。如何将命名约定应用于层次结构中的每个表,而不必针对每个具体类访问表?

我一提出这个问题,就明白了

iJoinedSubassConvention
是我需要实现的接口

public class OracleSubClassConvention : IJoinedSubclassConvention
{
    public void Apply(IJoinedSubclassInstance instance)
    {
        string fixedName = instance.EntityType.Name.ToUnderscoredNaming();
        instance.Table(fixedName);
    }
}

我通过查找任何具有方法
表(字符串)

的内容找到了它。我一发布这个问题,就发现了它

iJoinedSubassConvention
是我需要实现的接口

public class OracleSubClassConvention : IJoinedSubclassConvention
{
    public void Apply(IJoinedSubclassInstance instance)
    {
        string fixedName = instance.EntityType.Name.ToUnderscoredNaming();
        instance.Table(fixedName);
    }
}
我通过查找任何具有方法
表(字符串)
的内容找到了它