Перечисление в составном идентификаторе - свободно NHibernate 1.2 - PullRequest
2 голосов
/ 05 апреля 2011

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

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

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" в столбец Level.

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

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

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

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

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

2 голосов
/ 06 апреля 2011

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

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

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

...