【发布时间】:2012-06-06 07:33:33
【问题描述】:
在我的 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(" ", "_"));
}
}
此解决方案仅部分有效。正如您从代码中看到的那样,我试图通过替换下划线来使枚举字符串看起来不错,以便获得“大客户”而不是“大客户”。这行不通。将换行符放入代码中,我注意到被覆盖的 GetInstance 函数被调用,但 GetValue 函数从未被触发。任何帮助将不胜感激。
【问题讨论】:
-
为什么首先要下划线?命名枚举成员的“.Netty”方式是 BigCustomer 和 SmallCustomer。
-
@Oskar - 我认为这从代码中很明显。我想要一个不错的输出,所以 BigCustomer 是不可能的。最简单的方法似乎是用空格代替下划线。
标签: c# nhibernate orm