Свободные карты классов Nhibernate и порядок столбцов

Наши сущности обладают группой общих свойств. Чтобы уменьшить повторяющееся сопоставление, я создал базовую карту ClassMap, которая отображает идентификаторы и общие свойства. Для ClassMap каждой сущности я просто подклассифицирую базу, и она отлично работает. Для нового проекта мы также позволяем NH сгенерировать для нас схему БД. Проблема в том, что порядок столбцов таков, что сначала отображаются свойства из базового ClassMap, а затем все, что отображается в подклассе. Требование для этой сборки состоит в том, чтобы столбцы располагались в определенном порядке.

Чтобы обойти это, я сделал следующее.

public class BaseMap<T> : ClassMap<T> where T : Entity
{
    public BaseMap()
    {
        Id(x => x.Id);
        MapEntity();
        Map(x => x.CommonProperty1);
        Map(x => x.CommonProperty2);
        Map(x => x.CommonProperty3);
    }

    protected virtual void MapEntity()
    {
    }
}

public class SomeEntityMap : BaseMap<SomeEntity>
{
    public SomeEntity()
    {
        base.MapEntity();
    }

    protected override void MapEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}

Это работает, но похоже на взлом. Помимо фактора взлома, есть ли здесь что-нибудь, что может вызвать проблемы?


person Roco72    schedule 17.09.2010    source источник


Ответы (2)


Если бы вы сделали базовый класс и метод карты абстрактными, это было бы менее хакерским ...

public abstract class BaseMap<T> : ClassMap<T> where T : Entity
{
    public BaseMap()
    {
        Id(x => x.Id);
        MapEntity();
        Map(x => x.CommonProperty1);
        Map(x => x.CommonProperty2);
        Map(x => x.CommonProperty3);
    }

    protected abstract void MapEntity();

}

public class SomeEntityMap : BaseMap<SomeEntity>
{
    protected override void MapEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}

Это позволит сохранить столбцы общих свойств в конце таблицы. Имейте в виду, что столбцы внешнего ключа все равно будут добавляться после них. Я не думаю, что есть какой-либо способ полностью контролировать порядок столбцов без изменения, если вы не измените вручную сценарии создания схемы.

person dotjoe    schedule 15.11.2010

Мне просто нужно было самому реализовать нечто подобное.

Предполагая, что у вас есть

public class SomeEntity : Entity
{ 
    ...
}

Менее хакерский способ:

public abstract class BaseMap<T> : ClassMap<T> where T : Entity
{
    public BaseMap()
    {
        Id(x => x.Id);
        Map(x => x.CommonProperty1);
        Map(x => x.CommonProperty2);
        Map(x => x.CommonProperty3);
    }
}

public class SomeEntityMap : BaseMap<SomeEntity>
{
    public SomeEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}

Тот же результат в конце, но вы не используете переопределенные методы для добавления сопоставлений. Об этом позаботятся автоматически.

person mimix    schedule 30.09.2010
comment
?? ... SomeEntityMap не будет даже содержать свойств CommonPropertyX, не говоря уже о порядке, о котором говорит OP. - person Yogesh; 30.09.2010
comment
Ха-ха. Хороший звонок Йогеш. У меня SomeEntityMap наследовал ClassMap, тогда как это должно было быть BaseMap. С этим изменением он включает общие свойства. - person mimix; 30.09.2010
comment
+1 Верно. Я также не понимаю, почему OP вообще использовал виртуальный метод. - person Groo; 04.11.2010
comment
@Groo, потому что он хочет иметь столбцы базового класса после столбцов в извлеченном классе, который не достигается с помощью конструкторов - person Firo; 07.05.2012