【问题标题】:Mapping a collection of enums with NHibernate使用 NHibernate 映射枚举集合
【发布时间】:2008-09-17 01:11:21
【问题描述】:

使用 NHibernate 映射枚举集合

具体来说,使用 Attributes 进行映射。

目前我有这个工作将集合映射为 Int32 类型,NH 似乎可以处理它,但它并不完全理想。

在尝试将集合映射为我尝试映射的枚举类型时,我收到的错误是“无法确定类型”。

我发现一个帖子说定义一个类为

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

然后将枚举映射为 CEnumType,但这会给出“CEnumType is not mapped”或类似的东西。

那么有没有人有这方面的经验?

所以不管怎样,只是一个简单的参考代码sn-p来举个例子

    [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;}
        }
}

那么,任何人都得到了正确的属性让我将这个枚举集合映射为实际的枚举?如果它们也以字符串而不是整数的形式存储在数据库中,那就太好了,但这并不是完全必要的。

【问题讨论】:

    标签: nhibernate collections enums attributes nhibernate-mapping


    【解决方案1】:

    您需要直接映射您的 CEnum 类型。在 XML 映射中,这意味着在您的 NHibernate XML 映射文件中创建一个新的类映射元素。

    <pre></pre>

    <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

    【讨论】:

      【解决方案2】:

      我就是这样做的。可能有更简单的方法,但这对我有用。

      编辑:对不起,我忽略了你想要它作为一个列表。我不知道该怎么做...

      Edit2:也许您可以将其映射为受保护的 IList[string],然后像我使用简单属性一样转换为公共 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);
          }
      

      【讨论】:

        【解决方案3】:

        而不是

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

        试试

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

        即:将Int32 更改为String

        【讨论】:

          【解决方案4】:

          虽然我自己没有尝试过使用它,但不久前我偶然发现了这段代码,它看起来很有趣:

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

          就像我说的,我自己没有使用过它,但我打算在 RSN 项目中试一试。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-10
            • 2017-01-24
            • 2010-12-01
            • 2010-09-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多