web-dev-qa-db-ja.com

NHibernateを使用して列挙型を永続化する方法

NHibernateを使用してDBに列挙型を永続化する方法はありますか?これは、列挙型のコードと各値の名前の両方のテーブルを持っています。

エンティティなしで列挙型を保持したいが、他のすべての参照エンティティから列挙型のテーブルへの外部キー(列挙型のint表現)がまだあります。

52
Meidan Alon

なぜこれを複雑にしているのですか?とても簡単です。

マッピングは次のようになります。

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

モデルプロパティは次のようになります。

public virtual OrganizationTypes OrganizationType { get; set; }

Enumは次のようになります。

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

NHibernateは自動的にそれをすべて理解します。なぜ必要以上にタイプするのですか????

107
Emad

列挙型を直接使用できます: http://web.archive.org/web/20100225131716/http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont- Use-Int-If-You-Mean-Enum.aspx 。基本となる型が文字列の場合は文字列表現を使用する必要があります。数値の場合は数値表現のみを使用します。

しかし、質問の文言は、列挙型ではなく、何か別のものを探しているように聞こえます。別のエンティティークラスを作成せずにルックアップテーブルが必要なようです。別のエンティティークラスを作成せずにこれを行うことはできないと思います。

13

簡単ですがそれほど美しい解決策ではありません:

で整数フィールドを作成し、マッピングファイル内のマッピングをフィールドに設定します。整数フィールドを使用するパブリックプロパティを作成します。

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

私はNHibernate 3.2を使用していますが、これはうまく機能します:

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

ただし、汎用のEnumStringTypeがいつ追加されたかはわかりません。

4
Jamie

風格のあるパターンを使用してみてください。 Uouはロジックを内部クラスに配置できます。 「列挙型」に含まれるべきロジックがある場合、私はこれを特別に多く使用します。たとえば、以下のコードには、抽象化されたIsReadyForSubmission()があり、ネストされたサブクラスのそれぞれに実装されています(1つだけを示しています)。 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