使用NHibernate映射枚举的集合
具体来说,将属性用于映射。
目前,我正在将集合映射为Int32类型,并且NH似乎会处理它,但这并不是很理想。
当尝试将集合映射为我要映射的枚举类型时,收到的错误是"无法确定类型"。
我找到了一条帖子,据说将一个类定义为
1 2 3
| public class CEnumType : EnumStringType {
public CEnumType() : base(MyEnum) { }
} |
,然后将枚举映射为CEnumType,但这会显示"未映射CEnumType"或类似内容。
那么有人有这样做的经验吗?
因此,无论如何,仅是一个简单的参考代码片段就可以用
给出示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| [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;}
}
} |
那么,有人为我提供了正确的属性,可以将此枚举集合映射为实际枚举吗?如果它们也以字符串而不是ints的形式存储在数据库中,那将是非常好的,但这不是完全必要的。
您将需要直接映射您的CEnum类型。在XML映射中,这意味着在NHibernate XML映射文件中创建一个新的类映射元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <wyn>
[cc]<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> |
code> pre>
要使用属性映射来做到这一点,请在您的CEnum类的顶部进行如下操作:
[NHibernate.Mapping.Attributes.Class(Table ="CEnumTable")] //etc as you require
虽然我自己还没有尝试使用它,但不久前我偶然发现了这段代码,它看起来很有趣:
http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/08/12/enumeration-classes.aspx
就像我说的那样,我自己并没有使用过,但是我打算在RSN项目中尝试一下。
而不是
1
| [NHibernate.Mapping.Attributes.Element(2, Column ="EAction", Type ="Int32")] |
尝试
1
| [NHibernate.Mapping.Attributes.Element(2, Column ="EAction", Type ="String")] |
ie:将Int32更改为String
这就是我这样做的方式。也许有一种更简单的方法,但这对我有用。
编辑:对不起,我忽略了您想要它作为列表的情况。我不知道该怎么办...
Edit2:也许您可以将其映射为受保护的IList [string],并像我对一个简单属性所做的那样转换为公共IList [EAction]。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| 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);
} |