2008-09-17 95 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