Перечисление в составном идентификаторе - свободный NHibernate 1.2

Отображение свойства перечислимого типа, являющегося частью составного ключа, похоже, изменилось с int на string, и нет возможности изменить его обратно.

У меня есть этот класс данных:

public class Table5
{
    public virtual int Value { get; set; }

    public virtual Level Level { get; set; }

    public virtual string Name { get; set; }

    // Equality operators omitted
}

public enum Level
{
    Hi,
    Lo
}

с этим отображением:

public class Table5Map : ClassMap<Table5>
{
    public Table5Map()
    {
        Table("Table5");

        CompositeId()
            .KeyProperty(x => x.Value)
            .KeyProperty(x => x.Level);

        Map(x => x.Name);
    }
}

Столбец «Уровень» в базе данных является целым числом.

Раньше это работало, но с его версией Fluent оно пытается записать строки «Hi» и «Lo» в столбец «Уровень».

Как заставить его отображать целое число?


person Nick    schedule 05.04.2011    source источник


Ответы (2)


Самый простой способ - просто установить Type для ключевого свойства:

CompositeId()
    .KeyProperty(x => x.Value)
    .KeyProperty(x => x.Level, m => m.Type(typeof(int)));

Карты FNH по умолчанию всегда перечисляются как строки. Напротив, enum внутри составного идентификатора по умолчанию в FNH1.0 было сопоставлено с int. Вероятно, он был изменен, чтобы исправить такое несоответствие в более поздних версиях. .

person Jakub Linhart    schedule 05.04.2011
comment
Разве вы не можете сделать это с помощью соглашения? - person BradLaney; 04.01.2012

Попробуйте это изменить в своем отображении:

/// snip ///
 CompositeId()
    .KeyProperty(x => x.Value)
    .KeyProperty(x => x.Level, c => c.ColumnName("Level").Type(typeof(Level)));
/// snip ///

Этот «трюк» сработал для меня, когда мне пришлось иметь дело с устаревшей базой данных, у которой было много составных ключей. Если вам нужен эквивалентный «трюк» для неключевых свойств, посмотрите здесь принятый ответ. Удачи, и пусть все ваши базы данных не всегда будут устаревшими!

person Sixto Saez    schedule 05.04.2011
comment
Оба предложения работали нормально. Спасибо за вашу помощь. Вы не поверите, насколько унаследованы наши базы данных! - person Nick; 06.04.2011
comment
Разве вы не можете сделать это с помощью соглашения? - person BradLaney; 04.01.2012