Свободный NHibernate - Как отобразить список <enum>? - PullRequest
10 голосов
/ 13 июля 2011

У меня есть класс и внутри него строка и список перечислителей.

public enum SomeEnum
{
    Undefined=0,
    Enum1,
    Enum2,
    Enum3,
    End
}
public class SomeObject
{
    public virtual int ID{get; set;}
    public virtual String Name {get; set;}
    public virtual IList<SomeEnum> EnumList {get; set;}
}

Теперь должен быть список SomeObjects, содержащий ID и Name. Должна быть другая карта, подобная этой:

5 2
5 3
3 1
9 3

Это означает, что игрок с ID 5 имеет Enum2 и Enum3, другой игрок с ID 3 имеет Enum1, а игрок с ID 9 имеет Enum3. Они говорят, что можно отобразить int, float и т. Д., Но я не хочу создавать IList из моего списка.

Есть ли простой способ заставить беглый nhibernate сделать это?

HasMany(x => x.EnumList )
    .Cascade.All()
    .Table("ObjectEnumTable");

Этот файл сопоставления выдает исключение и говорит: «Ассоциация ссылается на не сопоставленный класс: SomeEnum».

Заранее спасибо.

Ответы [ 2 ]

13 голосов
/ 13 июля 2011

Вам лучше хранить список значений перечисления как прямое значение перечисления Flags, но если вам абсолютно необходим список перечислений (вам нужна поддержка дубликатов или устаревшей базы данных), тогда ваше отображение должно выглядеть так:

HasMany(x => x.EnumList )
    .Cascade.All()
    .Table("ObjectEnumTable")
    .Element("EnumValueColumn");

Ключ - это метод .Element (), который вы должны иметь для любого отношения не-сущности HasMany, включая строки, целые и т. Д. Это даст вам столбец ID, ссылающийся на вашу родительскую сущность, истолбец EnumValueColumn со значением перечисления для каждого элемента.

1 голос
/ 13 июля 2011

Проблема не в том, что вы пытаетесь сохранить Enum, хотя это помогает, если вы указали базовый тип.Проблема в том, что вы пытаетесь сохранить список (это становится ассоциацией один ко многим в NHibernate).Элементы в списке должны быть объектами, чтобы NHibernate мог сопоставить их с таблицей.Это вариант для создания объекта только с Id и вашим значением Enum?Это позволит NHibernate сохранить его.Или, если вы боитесь снижения производительности, создайте логику получения и установки, которая может хранить ваш полный список в виде строки.

public class SomeObject
{
    public virtual int Id { get; set; }
    public virtual String Name { get; set; }
    public virtual IList<SomeEnumClass> EnumList { get { return enumList; } set     { enumList = value; } }
    private IList<SomeEnumClass> enumList = new List<SomeEnumClass>();
}

public enum SomeEnum : int
{
    Undefined = 0,
    Enum1,
    Enum2,
    Enum3,
    End
}


public class SomeEnumClass
{
    public virtual int Id { get; set; }
    public virtual SomeEnum Value {get; set;}
}

Вы также можете посмотреть: Список картиспользуя Fluent Nhibernate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...