web-dev-qa-db-fra.com

Comment conserver une énumération en utilisant NHibernate

Existe-t-il un moyen de conserver une énumération dans la base de données à l'aide de NHibernate? C'est-à-dire avoir une table du code et du nom de chaque valeur dans l'énumération.

Je veux conserver l'énumération sans entité, mais j'ai toujours une clé étrangère (la représentation int de l'énumération) de toutes les autres entités de référence à la table de l'énumération.

52
Meidan Alon

Pourquoi êtes-vous trop compliqué? C'est vraiment simple.

Le mappage ressemble à ceci:

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

La propriété du modèle ressemble à ceci:

public virtual OrganizationTypes OrganizationType { get; set; }

L'Enum ressemble à ceci:

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

NHibernate comprendra tout cela automatiquement. Pourquoi taper plus que nécessaire ????

107
Emad

Vous pouvez utiliser le type d'énumération 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, il doit utiliser la représentation sous forme de chaîne, s'il est numérique, il utilisera simplement la représentation numérique.

Mais le libellé de votre question donne l'impression que vous recherchez quelque chose de différent, pas tout à fait un énum. Il semble que vous souhaitiez une table de recherche sans créer de classe d'entité distincte. Je ne pense pas que cela puisse être fait sans créer une classe d'entité séparée.

13
Garo Yeriazarian

Une solution simple mais pas si belle:

Créez un champ entier avec et définissez le mappage dans le fichier de mappage sur le champ. Créez une propriété publique qui utilise le champ entier.

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

J'utilise NHibernate 3.2, et cela fonctionne très bien:

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

Je ne sais pas quand le générique EnumStringType a été ajouté, cependant.

4
Jamie

Essayez d'utiliser un modèle de stratégie. Vous pouvez ensuite mettre de la logique dans vos classes internes. J'utilise cela beaucoup surtout quand il y a une logique qui devrait être contenue dans "l'énumération". Par exemple, le code ci-dessous a le résumé IsReadyForSubmission () qui est ensuite implémenté dans chacune des sous-classes imbriquées (une seule représentée). 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
}
2
RhysC