52 votes

Comment faire pour conserver un enum à l'aide de NHibernate

Est-il un moyen de conserver un enum pour la DB à l'aide de NHibernate? C'est avoir une table à la fois le code et le nom de chaque valeur de l'enum.

Je veux garder l'enum sans qu'une entité, mais encore une clé étrangère (int représentation de l'enum) de toutes les autres entités de référence pour l'enum de la table.

107voto

eibrahim Points 1500

Pourquoi êtes-vous les gars à plus de compliquer cette? Il est vraiment très simple.

La cartographie ressemble à ceci:

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

Le modèle de la propriété ressemble à ceci:

public virtual OrganizationTypes OrganizationType { get; set; }

L'Enum ressemble à ceci:

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

NHibernate automatiquement tout comprendre. Pourquoi le type de plus que vous avez besoin????

13voto

Garo Yeriazarian Points 2189

Vous pouvez utiliser le type enum directement: http://web.archive.org/web/20100225131716/http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-If-You-Mean-Enum.aspx. Si votre type sous-jacent est une chaîne de caractères, il doit utiliser la représentation de chaîne, si elle est numérique, il suffit d'utiliser la représentation numérique.

Mais votre formulation de la question sonne comme vous êtes à la recherche de quelque chose de différent, pas tout à fait un enum. Il semble que vous voulez une table de recherche, sans création d'une entité distincte de la classe. Je ne pense pas que cela peut se faire sans la création d'une entité distincte de la classe.

6voto

Paco Points 6156

Facile mais pas si belle solution:

Créer un champ de type entier et définir le mappage dans le fichier de mappage dans le domaine. Créer une propriété publique qui utilise le champ entier.

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

4voto

Jamie Points 21

Je suis à l'aide de NHibernate 3.2, et cela fonctionne très bien:

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

Vous ne savez pas quand le générique EnumStringType ont été ajoutés.

2voto

RhysC Points 645

Essayez d'utiliser une autre stratégie de modèle. Uou pouvez ensuite mettre de la logique dans votre intérieur des classes. J'utilise de ce fait beaucoup surtout quand il y a une logique qui devraient être contenues dans les "enum". Par exemple, le code ci-dessous est le résumé IsReadyForSubmission (), qui est ensuite mis en œuvre dans chacune des sous-classes imbriquées (un seul est représenté). 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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X