Прошу прощения за то, что я не получил полного ответа, я изо всех сил пытался настроить NHib / свободно на этой машине. Я взял старый пользовательский тип и изменил его, чтобы он соответствовал вашему статусу enum. Я думаю, что в более поздних версиях nHibernate некоторые интерфейсы методов могли измениться, но я думаю, что это дает хорошую отправную точку.
class StatusUserType : ICompositeUserType
{
public object GetPropertyValue(object component, int property)
{
// 0 = foo
// 1 = bar
// 2 = baz
Status status = (Status)component;
if (property == 0)
{
return status |= Status.Foo;
}
else if (property == 1)
{
return status |= Status.Bar;
}
else
{
return status |= Status.Baz;
}
}
public void SetPropertyValue(object component, int property, object value)
{
throw new NotImplementedException();
}
public new bool Equals(object x, object y)
{
if (x == y) return true;
if (x == null || y == null) return false;
return x.Equals(y);
}
public object NullSafeGet(System.Data.IDataReader dr, string[] names, ISessionImplementor session, object owner)
{
if (dr == null)
{
return null;
}
string fooColumn = names[0];
string barColumn = names[1];
string bazColumn = names[2];
bool isFoo = NHibernateUtil.Boolean.NullSafeGet(dr, fooColumn, session, owner);
bool isBar = NHibernateUtil.Boolean.NullSafeGet(dr, barColumn, session, owner);
bool isBaz = NHibernateUtil.Boolean.NullSafeGet(dr, bazColumn, session, owner);
Status status = (isFoo ? Status.Foo : Status.None) | (isBar ? Status.Bar : Status.None) | (isBaz ? Status.Baz : Status.None);
return status;
}
public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index, ISessionImplementor session)
{
if (value == null)
return;
Status status = (Status)value;
bool isFoo = ((status & Status.Foo) != 0);
bool isBar = ((status & Status.Bar) != 0);
bool isBaz = ((status & Status.Baz) != 0);
NHibernateUtil.Boolean.NullSafeSet(cmd, isFoo, index, session);
NHibernateUtil.Boolean.NullSafeSet(cmd, isBar, index + 1, session);
NHibernateUtil.Boolean.NullSafeSet(cmd, isBaz, index + 2, session);
}
public object DeepCopy(object value)
{
return (Status)value;
}
public object Disassemble(object value, ISessionImplementor session)
{
return DeepCopy(value);
}
public object Assemble(object cached, ISessionImplementor session, object owner)
{
return DeepCopy(cached);
}
public string[] PropertyNames
{
get { return new string[3] { "IsFoo", "IsBar", "IsBaz" }; }
}
public IType[] PropertyTypes
{
get
{
return new IType[3] { NHibernateUtil.Boolean, NHibernateUtil.Boolean, NHibernateUtil.Boolean };
}
}
public Type ReturnedClass
{
get { return typeof(Status); }
}
public bool IsMutable
{
get { return false; }
}