Как получить наследование одной таблицы для иерархии одного класса - PullRequest
0 голосов
/ 20 июня 2011

Я использую FluentNHibernate с AutoMapping для сопоставления моих постоянных классов.Отображение таблицы по умолчанию для каждого подкласса прекрасно работает почти для всех моих иерархий классов, кроме одной: здесь у меня есть абстрактный базовый класс «A», в A есть все необходимые поля данных.Подклассы «B», «C»,… «X» отличаются только поведением.«Таблица на класс» приведет к большому количеству нежелательных таблиц.
Я хочу создать класс переопределения для создания одной таблицы A (я могу сделать это с помощью переопределения IncludeBaseClass. Но как мне установить класс переопределения Discriminatorчто помещает все подклассы в эту таблицу также? Свободная документация предлагает следующее:

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 ]

1 голос
/ 20 июня 2011

Поместите этот метод в класс, который наследует от DefaultAutomappingConfiguration.
также, возможно, потребуется выполнить: return (type == typeof(A) || type.IsSubclassOf(typeof(A));

0 голосов
/ 21 июня 2011

Метод «IsDiscrimination» является частью класса «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 переопределяется, так как использование этого класса конфигурации предотвращает использование предложения «Где» в отображении. Он передается в процесс отображения следующим образом:

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