2008-09-17 20 views
1

は、マッピングの属性を使用して、具体的にNHibernateのは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型ではなく文字列型としてdbに格納されていれば本当にいいですが、完全には必要ではありません。

答えて

1

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

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

Edit2:おそらく私は単純なプロパティと同様に保護されたIList [文字列]としてマップすることができます、公共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); 
    } 
1

代わりの

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

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

すなわちを試してみてください。私はそれを自分自身を使用して試していないもののInt32String

2

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

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

:属性マッピング、あなたのCEnumクラスの上にこのようなものでそれを行うには

<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>