2008-09-17 115 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;} 
     } 
} 

一個例子因此,任何人有正確的屬性對我來說,這個映射集合枚舉作爲實際枚舉的?如果將它們作爲字符串而不是整數存儲在數據庫中將會非常好,但它不是完全必要的。

回答

1

這是我這樣做的方式。這可能有一個更簡單的方法,但這對我很有用。

編輯:對不起,我忽視了你希望它作爲一個列表。我不知道該怎麼做...

編輯2:也許你可以將它映射爲受保護的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映射文件中創建一個新的類映射元素。

<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