Свободные соглашения о классах автоматического сопоставления NHibernate не применяются ко всей иерархии классов

Я пытаюсь автоматизировать простую иерархию наследования с помощью Fluent Nhibernate, и мне нужно иметь немного другое имя для каждой таблицы, чем для ее класса (подчеркивание вместо случая Паскаля). Это кажется очевидным местом для использования соглашений. Я также хочу использовать стратегию таблицы на подкласс, но комбинация, кажется, вызывает у меня проблему: соглашение применяется только к базовому классу иерархии.

Вот мой autopping:

AutoMap
    .AssemblyOf<BaseRule>()
    .IncludeBase<BaseRule>() // "BaseRule" is an abstract class
    .Conventions.Add( DefaultCascade.All() )
    .Conventions.Add<OracleTableNameConvention>()

Как я хочу, чтобы мои классы были сопоставлены (имя класса -> имя таблицы):

  abstract class BaseRule -> Base_Rule
  class NumberRule : BaseRule -> Number_Rule
  class PatternStringRule : BaseRule -> Pattern_String_Rule

Что я на самом деле получаю:

  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 В строке из моего автопоказа имена становятся тем, что я хочу, за исключением того, что они становятся таблицей для каждого конкретного класса. Я хочу использовать таблицу наподкласс, оставляя все общие данные в одной общей базовой таблице.

Я могу добавить переопределения для каждого имени, и я сделаю это, если мне придется, но я бы предпочел не делать этого.

Кажется, это должно быть явно поддерживаемое поведение. Как можно применить соглашение об именах к каждой таблице в иерархии, не переходя к таблице на конкретный класс?

1 ответ

Решение

Как только я отправил этот вопрос, я понял это.

IJoinedSubclassConvention это интерфейс, который мне нужно было реализовать.

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

Я нашел это, ища все, что было метод Table(string),

Другие вопросы по тегам