У нас есть пользовательский тип, который в основном соответствует System.Int64, который используется для идентификаторов нашей системы (он предоставляет несколько дополнительных ограничений на то, каким может быть базовое длинное значение).
У нас также естьIUserType определен, чтобы позволить нам сопоставлять свойства этого типа с NHibernate, но при работе с базой данных oracle мы сталкиваемся с тем, что кажется известным, как "Int / Decimal Problem"
соответствующие части пользовательского типа (get / set) находятся здесь:
public object NullSafeGet(IDataReader rs, string[] names, object owner) {
var longValue = Convert.ToInt64(NHibernateUtil.Int64.NullSafeGet(rs, names[0]));
return new Identifier(longValue);
}
public void NullSafeSet(IDbCommand cmd, object value, int index) {
if (value == null || ((Identifier)value).IsNew) {
NHibernateUtil.Int64.NullSafeSet(cmd, null, index);
return;
}
NHibernateUtil.Int64.NullSafeSet(cmd, ((Identifier)value).Value, index);
}
В настоящее время мы получаем недопустимые исключения приведения из метода SaveOrUpdate ISession при попытке сохранить что-либо, содержащее свойство идентификатора.
Существует ли хороший (или даже приемлемый) способ решения этой проблемы способом, который работает как для Oracle, так и для сервера SQL, или нам нужно будет создать две разные реализации UserType?