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

因此,有人为我提供了正确的属性,可以将此枚举集合映射为实际枚举吗? 如果它们也以字符串而不是ints的形式存储在数据库中,那将是非常好的,但这不是完全必要的。

===============>>#1 票数: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

===============>>#2 票数:1

代替

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

尝试

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

即:将Int32更改为String

===============>>#3 票数:1

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

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

就像我说的那样,我自己并没有使用它,但是我将在RSN项目中尝试一下。

===============>>#4 票数:1

这就是我做到的方式。 可能有一种更简单的方法,但这对我有用。

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

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

  ask by bfabry translate from so

未解决问题?本站智能推荐:

2回复

在NHibernate中映射枚举的集合

我有一个带有枚举集合的类: 将Class1.cs 此类的映射文件的内容是什么?
1回复

如何在Nhibernate中映射抽象类的集合

我一直在阅读《行动中的Nhibernate》,但是关于映射多态集合的部分在如何做到这一点上太短了。 我有以下代码 使用上面的代码,我没有收到任何错误,但是从数据库中检索我的对象后,Module中的机器集合仍然为空。 机器(及其子类)的映射看起来不错,因为正确返回了机器类型的属性。
1回复

nHibernate映射问题-无法删除集合的成员

好。 所以情况是: 家长班级,其中有孩子班级的IDictionary。 我希望在父类删除时删除这些子类。 这很好。 我也希望能够分别删除子类的成员,但这是行不通的。 所以我的问题是; 为什么不能删除这些子成员? 我得到的错误是: 无法删除,将被级联读取
1回复

如何在nhibernate公式映射规范内引用枚举值?

我有两种实体类型: RunContainer父实体类型 运行子实体类型 Run具有属性Status,其类型为RunStatus,如下所示: RunContainer具有计算所得的属性ActiveRunCount,如下所示: 在RunContainer.A
1回复

NHibernate属性映射列表

我是NHibernate的新开发人员。 我使用的是属性,而不是映射文件,并且已将应用程序配置为自动创建表。 我有两个班级,组和用户。 使用Group类,我有一个用户列表 我找不到正确的属性,因此将有两个具有一对多关系的表。 有人可以帮忙吗? 谢谢罗尼
1回复

如何在不实现NHibernate.Collection的情况下映射使用Fluent NHibernate实现IEnumerable的自定义集合?

我们正在使用自定义集合类来保存我们的实体集合,但是在映射Fluent NHibernate的集合属性时遇到了问题。 我已经阅读了本网站上所有类似主题的文章,但似乎都没有针对我们的特殊情况。 我们模型的典型收集类是: 这是父对象的属性: 我尝试将其映射如下: 当我创
1回复

nhibernate自定义集合处理

我有一个工作的一对多关系(非bbidirectional),其中Resource有一组实现的许多Allocations,如下所示。 域需要通过AddAllocation,RemoveAllocation等管理它的分配集合做更多的事情。所以从对象的角度来看,我想把那些非持久性的额外逻辑放到另一个
1回复

现有表中NHibernate中的枚举

模式设计中我有很多表(旧式,不能更改): 小部件记录示例: WidgetType记录示例: 基本上,数据库中的许多表都有与之关联的对应“类型”表,我希望将它们构造为对象模型中的枚举,即: 有什么办法可以使用NHibernate做到这一点,如果是这样的话,映射会是什
1回复

从NHibernate开始

我开始使用NHibernate,我有点迷失了。 我只是试图做最小的代码来映​​射一个简单的表并查询其所有成员。 我知道我应该从xml映射开始,但是,我正在尝试使用属性映射(感觉比流利,更高效,比xml更易于维护) 我的课程-映射名为“ cars”的表,如下所示: 我的hib
2回复

枚举解析似乎不适用于Fluent NHibernate

我有一个名为Salutation的Enum数据访问类: 我正在使用NHibernate进行课程,直到今天早上我才使用.hbm.xml文件进行映射。 但是,我现在已经切换到使用Fluent NHibernate,但加载类的实例失败(例如): [HibernateException: