Как сохранить перечисление с помощью 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.