要将enum作为字符串映射为流利的NHibernate,您需要遵循以下步骤:
public enum Color
{
Red,
Green,
Blue
}
IUserType
接口来自定义枚举类型的映射。例如,您可以创建一个名为ColorUserType
的类来实现IUserType
接口:public class ColorUserType : IUserType
{
public new bool Equals(object x, object y)
{
if (ReferenceEquals(x, y)) return true;
if (x == null || y == null) return false;
return x.Equals(y);
}
public int GetHashCode(object x)
{
return x.GetHashCode();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var value = NHibernateUtil.String.NullSafeGet(rs, names[0]);
if (value == null) return null;
return Enum.Parse(typeof(Color), value.ToString());
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value == null)
{
NHibernateUtil.String.NullSafeSet(cmd, null, index);
}
else
{
NHibernateUtil.String.NullSafeSet(cmd, value.ToString(), index);
}
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
public SqlType[] SqlTypes { get; } = { NHibernateUtil.String.SqlType };
public Type ReturnedType { get; } = typeof(Color);
public bool IsMutable { get; } = false;
}
ColorUserType
来映射您的枚举属性。例如,假设您有一个名为Product
的类,其中包含一个Color
属性,您可以这样映射它:public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Color, cm =>
{
cm.Column("color");
cm.CustomType<ColorUserType>();
cm.Not.Nullable();
});
}
}
现在,当您使用NHibernate查询和保存Product
对象时,它将自动将Color
属性映射为字符串,并在数据库中存储枚举值的名称。这样,您就可以在NHibernate中流利地使用枚举类型了。
领取专属 10元无门槛券
手把手带您无忧上云