Свободные соглашения о классах автоматического сопоставления 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)
,