NHibernate中Mapping文件映射enum字段

11 篇文章 0 订阅


    前一段时间使用过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

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



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lingxyd_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值