1

NHibernate を使用した列挙型のコレクションのマッピング

具体的には、マッピングに属性を使用します。

現在、私はコレクションをタイプ Int32 としてマッピングする作業を行っており、NH がそれを処理しているように見えますが、それは正確には理想的ではありません。

マップしようとしている列挙型のコレクションをマップしようとすると、「型を特定できません」というエラーが表示されます。

クラスを次のように定義すると言った投稿を見つけました

public class CEnumType : EnumStringType {
  public CEnumType() : base(MyEnum) { }
}

次に、列挙型をCEnumTypeとしてマップしますが、これにより「CEnumTypeがマップされていません」または同様の結果が得られます。

それで、誰かがこれを行った経験がありますか?

とにかく、例を示すための単純な参照コードのスニペットです

    [NHibernate.Mapping.Attributes.Class(Table = "OurClass")]
    public class CClass : CBaseObject
    {
        public enum EAction
        {
            do_action,
            do_other_action
        };

        private IList<EAction> m_class_actions = new List<EAction>();

        [NHibernate.Mapping.Attributes.Bag(0, Table = "ClassActions", Cascade="all", Fetch = CollectionFetchMode.Select, Lazy = false)]
        [NHibernate.Mapping.Attributes.Key(1, Column = "Class_ID")]
        [NHibernate.Mapping.Attributes.Element(2, Column = "EAction", Type = "Int32")]
        public virtual IList<EAction> Actions
        {
            get { return m_class_actions; }
            set { m_class_actions = value;}
        }
}

では、この列挙型のコレクションを実際の列挙型としてマップするための正しい属性を誰かが取得しましたか? それらが int ではなく文字列としてデータベースに格納されていれば本当にいいのですが、完全に必要というわけではありません。

4

4 に答える 4

2

CEnumタイプを直接マップする必要があります。XMLマッピングでは、これはNHibernateXMLマッピングファイルに新しいクラスマッピング要素を作成することを意味します。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="YourAssembly"
   auto-import="true" default-lazy="false">

   ...

   <class name="YourAssemblyNamespace.CEnum" table="CEnumTable" mutable="false" >
      <id name="Id" unsaved-value="0" column="id">
         <generator class="native"/>
      </id>

      ...

   </class>

</hibernate-mapping>

属性マッピングでそれを行うには、CEnumクラスの上に次のようなものを追加します。

[NHibernate.Mapping.Attributes.Class(Table = "CEnumTable")] //etc as you require

于 2010-05-11T02:46:56.993 に答える
1

自分で使ってみたことはありませんが、少し前にこのコードに出くわしました。

http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/08/12/enumeration-classes.aspx

私が言ったように、私はそれを自分で使用したことはありませんが、プロジェクト RSN で試してみるつもりです。

于 2008-11-07T05:20:15.410 に答える
1

これが私のやり方です。おそらくもっと簡単な方法がありますが、これは私にとってはうまくいきます。

編集:申し訳ありませんが、あなたがリストとしてそれを望んでいることを見落としていました. 私はそれを行う方法がわからない...

Edit2: おそらく、保護された IList[string] としてマップし、単純なプロパティで行うのと同じように public IList[EAction] に変換できます。

    public virtual ContractGroups Group
    {
        get
        {
            if (GroupString.IsNullOrEmpty())
                return ContractGroups.Default;

            return GroupString.ToEnum<ContractGroups>(); // extension method
        }
        set { GroupString = value.ToString(); }
    }

    // this is castle activerecord, you can map this property in NH mapping file as an ordinary string
    [Property("`Group`", NotNull = true)] 
    protected virtual string GroupString
    {
        get;
        set;
    }



    /// <summary>
    /// Converts to an enum of type <typeparamref name="TEnum"/>.
    /// </summary>
    /// <typeparam name="TEnum">The type of the enum.</typeparam>
    /// <param name="self">The self.</param>
    /// <returns></returns>
    /// <remarks>From <see href="http://www.mono-project.com/Rocks">Mono Rocks</see>.</remarks>
    public static TEnum ToEnum<TEnum>(this string self)
        where TEnum : struct, IComparable, IFormattable, IConvertible
    {
        Argument.SelfNotNull(self);

        return (TEnum)Enum.Parse(typeof(TEnum), self);
    }
于 2008-09-17T06:16:49.060 に答える
1

それ以外の

[NHibernate.Mapping.Attributes.Element(2, Column = "EAction", Type = "Int32")]

試す

[NHibernate.Mapping.Attributes.Element(2, Column = "EAction", Type = "String")]

例: を に変更Int32しますString

于 2008-10-18T00:31:11.613 に答える