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

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

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

Ответ 1

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

Отображение выглядит следующим образом:

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

Свойство модели выглядит следующим образом:

public virtual OrganizationTypes OrganizationType { get; set; }

Enum выглядит следующим образом:

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Не знаю, когда добавлен общий EnumStringType.

Ответ 5

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

[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
}

Ответ 6

Насколько мне известно, это невозможно по умолчанию. Однако Google предлагает несколько интересных результатов на NHibernate Enum. Один из способов, которым я, вероятно, попробую: Оран Деннисон Generic NHibernate Enum String Mapping, или, если вы можете изменить Enum, Persisiting Described Enums, как описано в NHibernate Forge.