Свободные карты классов Nhibernate и порядок столбцов - PullRequest
4 голосов
/ 17 сентября 2010

У наших организаций есть группа общих свойств. Чтобы уменьшить количество повторяющихся отображений, я создал базовый ClassMap, который отображает идентичности и общие свойства. Для каждого объекта ClassMap я просто делю основание на подклассы, и это прекрасно работает. Для нового проекта мы также позволяем NH сгенерировать схему DB для нас. Проблема в том, что порядок столбцов таков, что свойства из базового 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);        
    }
}

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

Ответы [ 2 ]

5 голосов
/ 15 ноября 2010

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

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);        
    }
}

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

3 голосов
/ 30 сентября 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);        
    }
}

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

...