IUserType, соответствующий Int64 с ODP.net - PullRequest
2 голосов
/ 22 января 2011

У нас есть пользовательский тип, который в основном соответствует 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?

1 Ответ

1 голос
/ 22 января 2011

После еще одного расследования выясняется, что проблема может заключаться в стратегии генерации идентификатора последовательности .Он пытается использовать запрос, подобный следующему:

INSERT INTO my_entity (id, name) 
VALUES (hibernate_sequence.nextval, :p0) 
returning id into :nhIdOutParam

Чтобы заставить идентификацию на основе последовательности работать так же, как это было бы на SQL-сервере (позволяя вставку и извлечение идентификатора одним запросом).Я предполагаю, что выходной параметр выражается в виде десятичной дроби, и именно здесь у меня возникают проблемы.

Переключение на "родную" стратегию генерации, которая работает, но я все равно хотел бы услышать любуюдругие идеи по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...