52

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

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

4

5 に答える 5

107

なぜあなたたちはこれを複雑にしているのですか?それは本当に簡単です。

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

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

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

public virtual OrganizationTypes OrganizationType { get; set; }

列挙型は次のようになります。

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

Hibernate は自動的にすべてを把握します。なぜ必要以上に入力するのですか????

于 2009-12-15T05:01:17.620 に答える
13

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

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

于 2008-11-03T02:33:57.993 に答える
6

簡単だがそれほど美しくない解決策:

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

private int myField;
public virtual MyEnum MyProperty
{
   get { return (MyEnum)myField; }
   set { myField = value; }
}
于 2008-11-02T17:19:24.010 に答える
4

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

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

ただし、一般的な EnumStringType がいつ追加されたのかはわかりません。

于 2012-05-15T17:23:20.847 に答える
2

戦略的なパターンを使用してみてください。その後、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
}
于 2009-10-07T08:05:06.557 に答える