现在的位置: 首页 > 综合 > 正文

NHibernate中Mapping文件映射enum字段

2013年10月12日 ⁄ 综合 ⁄ 共 1791字 ⁄ 字号 评论关闭

    前一段时间使用过Nhibernate,但一直没有研究透。更不用说FluentNHibernate了。

    在上次使用的时候,枚举类型的属性在数据库中保存为Int类型字段。那个时候我就直接写成了

 <property name="UserType" column="UserType" type="Int32"  not-null="true" ></property>

  能够正常使用。保存,获取等都能正常对应。但是:在通过CriteriaAPI查询的时候,如果此枚举需要作为条件查询的话,就必须要强制转换成int类型。否则报错。

   今天偶尔使用了Example来查询数据,有发生了问题。提示类型不一致。UserType与Int32不一致。

   

   又一次使我了解到,这样设置是不合理的。再次搜素资料,寻求高手。终于得到了答案。


解决方案如下:

   1、在Mapping文件中,此属性的type直接不指定。这样NHibernate可以自动匹配到相关的类型。同时生成的数据脚本也是Int类型。保存都是枚举所对应的Int值。

   2、可以在此属性的type中直接指定此枚举的全类型,包括assembly。例如:

type="dotNet.DataStatus,dotNet"

这样与1方法类似。所有的操作都能够正常进行。生成的也是Int类型。

但是问题又来了。如果在数据库不是保存int值怎么办?如果保存成字符串呢?比如枚举ToString()后保存。

NH提供了两个类:EnumCharType和EnumStringType来解决这个问题

这里可以参考:http://www.cnblogs.com/jiaxingseng/archive/2010/08/27/1810330.html

如:

public class EnumCharBaz
    {
        private Int32 id;
        private SampleCharEnum type;

        public virtual Int32 Id
        {
            get { return id; }
            set { id = value; }
        }

        public virtual SampleCharEnum Type
        {
            get { return type; }
            set { type = value; }
        }
    }

    public enum SampleCharEnum
    {
        On = 'N',
        Off = 'F',
        Dimmed = 'D'
    }

hbm如下:

    <class name="EnumCharBaz" table="bc_ecfoobarbaz">
        <id name="Id">
            <generator class="assigned"/>
        </id>
        <property name="Type" column="type" type="NHibernate.Type.EnumCharType`1[[NHibernate.Test.TypesTest.SampleCharEnum, NHibernate.Test]], NHibernate"/>
    </class>

使用内建的EnumStringType<T>

public class GenericEnumStringClass
    {
        public virtual int Id
        { 
            get;
            set;
        }

        public virtual SampleEnum EnumValue
        { 
            get;
            set;
        }
    }

    public enum SampleEnum
    {
        On,
        Off,
        Dimmed
    }

hbm如下:

 <class name="NHibernate.Test.TypesTest.GenericEnumStringClass, NHibernate.Test" table="bc_estr">
        <id name="Id" column="id">
            <generator class="assigned" />
        </id>

        <property name="EnumValue" type="NHibernate.Type.EnumStringType`1[[NHibernate.Test.TypesTest.SampleEnum, NHibernate.Test]], NHibernate" column="enumc"/>
    </class>

如果还不能满足需求,需要自定义的字符串来怎么办?

http://www.cnblogs.com/jiaxingseng/archive/2010/08/27/1810330.html

这位仁兄已经做了介绍,再次就不多废话了。

抱歉!评论已关闭.