在NHibernate中使用字符串枚举 - GetValue永远不会被触发

时间:2012-06-06 07:33:33

标签: c# nhibernate orm

在我的NHibernate驱动的应用程序中,我有类,其中类的某些属性不是完整的实体。即,我有一个客户类 客户类型属性。为客户类型属性创建单独的类似乎浪费资源。 我要做的是使用代码映射将客户类型映射到NHibernate 3.2中的枚举字符串。在StackOverflow上搜索, 我找到了一个可能的解决方案,其中包含以下代码:

   public class Customer
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual CustomerType CustomerType { get; set; }
    }

    public class CustomerMap : ClassMapping<Customer>
    {

        public CustomerMap()
        {
            Id(x => x.Id);
            Property(x => x.Name, m => m.Length(100));
            Property(x => x.CustomerType, m =>
                     {
                         m.Column("CustomerTypeId");
                         m.Type(typeof (CustomerTypeMap), null);
                     });

        }
    }

    public enum CustomerType
    {
        Big_Customer,
        Small_Customer
    }

    public class CustomerTypeMap : EnumStringType<CustomerType>       
    {
        public override object GetValue(object code)
        {
            return code == null
                    ? string.Empty
                    : code.ToString().Replace('_', ' ');
        }

        public override object GetInstance(object code)
        {

            var str = (string)code;

            if (string.IsNullOrEmpty(str)) return StringToObject(str);
            else return StringToObject(str.Replace(" ", "_"));
        }
    }

此解决方案仅部分有效。正如您从代码中看到的那样,我试图通过替换下划线来使枚举字符串看起来很好,以便获得“Big customer”而不是“Big_Customer”。这不起作用。将断行放入代码中,我注意到overrriden GetInstance函数被调用,但GetValue函数永远不会被触发。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我同意你不应该像CustomerType那样创建一个新的实体。 NHibernate也不指望你。流畅的NHibernate会默认将枚举映射为字符串(我假设您使用的是最新版本),但显然您希望获得更细粒度的控制。

自从我使用Fluent NH以来已经有一段时间了,但也许可以试试这个(除非API已被更改):

Map(x => x.CustomerType).Column("CustomerTypeId").CustomType<CustomerTypeMap>();

再一次,不确定这个(仍然)是否有效,因为API已经改变/改变很多。