Как сохранить перечисление с помощью NHibernate

Есть ли способ сохранить перечисление в БД с помощью NHibernate? Это таблица с кодом и именем каждого значения в перечислении.

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


person Meidan Alon    schedule 02.11.2008    source источник
comment
Решил ли какой-либо из этих ответов вашу проблему?   -  person UpTheCreek    schedule 09.05.2010
comment
@Sosh, нет, для важных перечислений я свернул сущность, а для других я просто использовал значение int.   -  person Meidan Alon    schedule 10.05.2010


Ответы (5)


Почему вы, ребята, слишком усложняете это? Это действительно просто.

Отображение выглядит так:

<property name="OrganizationType"></property>

Свойство модели выглядит так:

public virtual OrganizationTypes OrganizationType { get; set; }

Enum выглядит так:

public enum OrganizationTypes
{
    NonProfit = 1,
    ForProfit = 2
}

NHibernate автоматически во всем разберется. Зачем набирать больше, чем нужно ????

person Emad    schedule 15.12.2009
comment
Я не так хорошо знаком с Hibernate, поэтому не могу понять ваш пост. Вы можете объяснить, что такое свойство модели. Где это определяется? - person Alex Worden; 11.03.2010
comment
Я не понимаю, почему ваш ответ не получил голосов больше. Вы предоставляете ответ в виде понятного кода, который легко понять. - person Kevin Albrecht; 12.03.2010
comment
Это не работает в nHibernate 2.1, поскольку вызывает двоение: stackoverflow.com/ questions / 3247188 / - person brainimus; 19.07.2010
comment
Я подозреваю, что это не очень популярный ответ, потому что более серьезная проблема заключается в сохранении перечислений в виде строк. Как вы указали, хранение перечислений в виде целых чисел довольно тривиально, но хранить их как строки - проблема ... - person penderi; 01.04.2011
comment
Ответ eibrahim НЕ должен вызывать двоение, потому что тип организации не отображается на int. - person Lisa; 01.06.2011
comment
Я не думаю, что это действительно суть проблемы - это 100% правильный способ сопоставить свойство enum. Но @Meidan хочет (в дополнение к этому) иметь справочную таблицу, которая коррелирует целочисленные и строковые значения, чтобы могло быть ограничение внешнего ключа, а также, возможно, дополнительная видимость для отчетов о данных и тому подобное (по сути, отображение перечисление). - person Matt Enright; 03.11.2011

Вы можете напрямую использовать тип перечисления: http://web.archive.org/web/20100225131716/http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-If-You-Mean-Enum.aspx. Если ваш базовый тип является строкой, он должен использовать строковое представление, если оно числовое, оно будет просто использовать числовое представление.

Но формулировка вашего вопроса звучит так, как будто вы ищете что-то другое, а не совсем перечисление. Кажется, вам нужна таблица поиска без создания отдельного класса сущности. Я не думаю, что это можно сделать без создания отдельного класса сущности.

person Garo Yeriazarian    schedule 03.11.2008
comment
Эта ссылка не работает. Это должно: graysmatter.codivation.com/post/ - person UpTheCreek; 16.11.2009

Простое, но не очень красивое решение:

Создайте целочисленное поле с помощью и установите сопоставление в файле сопоставления с полем. Создайте общедоступное свойство, использующее целочисленное поле.

private int myField;
public virtual MyEnum MyProperty
{
   get { return (MyEnum)myField; }
   set { myField = value; }
}
person Paco    schedule 02.11.2008

Я использую NHibernate 3.2, и это отлично работает:

type="NHibernate.Type.EnumStringType`1[[enum_full_type_name, enum_assembly]], NHibernate"

Однако не уверен, когда был добавлен общий EnumStringType.

person Jamie    schedule 15.05.2012

Попробуйте использовать статический паттерн. Затем вы можете поместить логику в свои внутренние классы. Я использую это очень часто, когда есть логика, которая должна содержаться в "enum". Например, в приведенном ниже коде есть абстрактная функция IsReadyForSubmission (), которая затем реализуется в каждом из вложенных подклассов (показан только один). HTH

[Serializable]
public abstract partial class TimesheetStatus : IHasIdentity<int>
{
        public static readonly TimesheetStatus NotEntered = new NotEnteredTimesheetStatus();
        public static readonly TimesheetStatus Draft = new DraftTimesheetStatus();
        public static readonly TimesheetStatus Submitted = new SubmittedTimesheetStatus();
        //etc

        public abstract int Id { get; protected set; }
        public abstract string Description { get; protected set; }
        public abstract bool IsReadyForSubmission();

        protected class NotEnteredTimesheetStatus: TimesheetStatus
        {
            private const string DESCRIPTION = "NotEntered";
            private const int ID = 0;
            public override int Id
            {
                get { return ID; }
                protected set { if (value != ID)throw new InvalidOperationException("ID for NotEnteredTimesheetStatus must be " + ID); }
            }

             public override string Description
            {
                get { return DESCRIPTION; }
                protected set { if (value != DESCRIPTION)throw new InvalidOperationException("The description for NotEnteredTimesheetStatus must be " + DESCRIPTION); }
            }
            public override bool IsReadyForSubmission()
            {
                return false;
            }

        }
        //etc
}
person RhysC    schedule 07.10.2009