私の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" を取得するためにアンダースコアを置き換えることで、enum 文字列の見栄えを良くしようとしています。これはうまくいきません。コードに改行を入れると、オーバーライドされた GetInstance 関数が想定どおりに呼び出されるのに、GetValue 関数が呼び出されないことに気付きました。どんな助けでも大歓迎です。