У меня есть пользовательский тип пользователя, который используется для сопоставления десятичного значения из базы данных со свойством объекта, используя Fluent NHibernate.Объект работает правильно, как и сопоставление с объектом, но я не знаю, как динамически изменять точность и масштаб десятичного типа данных sql, чтобы я мог использовать различную точность и масштаб в разных картах классов.
Вот пример моего пользовательского типа:
public struct MyCustomType
{
private readonly decimal value;
public MyCustomType(decimal value)
{
this.value = value;
}
public static implicit operator MyCustomType(decimal value)
{
return new MyCustomType(value);
}
public static implicit operator decimal(MyCustomType value)
{
return value.value;
}
public string ToString(string format, IFormatProvider provider)
{
return value.ToString(format, provider);
}
}
А вот как я делаю пользовательский тип.
public class MyCustomUserType : IUserType
{
...
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
MyCustomType customType = (decimal)rs[names[0]];
return customType;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var parameter = (IDataParameter)cmd.Parameters[index];
parameter.Value = (decimal)(MyCustomType)value;
}
...
public SqlType[] SqlTypes
{
//I think I could hard code the precision and scale here
get { return new[] { SqlTypeFactory.Decimal }; }
}
public Type ReturnedType
{
get { return typeof(MyCustomType); }
}
public bool IsMutable
{
get { return true; }
}
}
И, наконец, вот как я отображаю объект
public class SomeObjectMappingBase: ClassMap<SomeObject>
{
protected SomeObjectMappingBase()
{
//Currently I do this
Map(x => x.CustomTypeField).CustomType<MyCustomUserType>();
//I would like to be able to do this but it does not work
Map(x => x.CustomTypeField).CustomType<MyCustomUserType>().Scale(10).Precision(20);
}
}