Как сохранить перечисление с помощью NHibernate - PullRequest
52 голосов
/ 02 ноября 2008

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

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

Ответы [ 5 ]

107 голосов
/ 15 декабря 2009

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

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

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

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

public virtual OrganizationTypes OrganizationType { get; set; }

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

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

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

13 голосов
/ 03 ноября 2008

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

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

6 голосов
/ 02 ноября 2008

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

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

private int myField;
public virtual MyEnum MyProperty
{
   get { return (MyEnum)myField; }
   set { myField = value; }
}
4 голосов
/ 15 мая 2012

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

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

Не уверен, когда добавляется универсальный EnumStringType.

2 голосов
/ 07 октября 2009

Попробуйте использовать шаблон Stategy. Тогда вы можете поместить логику в свои внутренние классы. Я использую это довольно часто, особенно когда есть логика, которая должна содержаться в «enum». Например, код ниже имеет абстрактный 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
}
...