SetParameter с IType не приводит к значимому запросу - PullRequest
0 голосов
/ 03 марта 2011

Если я сделаю что-то вроде этого:

  NHibernate.Type.IType type = NHibernate.NHibernateUtil.GetSerializable(myValueType);
  hibQuery.SetParameter("UserId", intObject, type);

MyValueType имеет тип Type, представляющий Int. Это не приводит к чему-то значимому. Отправленный SQL выглядит следующим образом: {...} where user0_.UserId=@p0;@p0 = 0x0001000000FFFFFFFF010000000000000004010000000C53797374656D2E496E74333201000000076D5F76616C75650008010000000B (@ p0 не объявлено с чем-то значащим)

Если я делаю это таким образом (только для тестирования):

hibQuery.SetParameter<int>("UserId", (int)intObject);

результат будет вполне нормальным: {...}where user0_.UserId=@p0;@p0 = 1

Что я здесь не так делаю? sl3dg3

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Я не вижу ничего плохого в коде, который вы разместили.Единственное, о чем я могу думать, это то, что intObject на самом деле не является Int32 (может быть, это на самом деле Int64 или Int16 или даже десятичное число, и приведение в универсальной версии скрывает проблему), или потому что оно «упаковано» какОбъект, сериализующий его как Int32 без предварительного приведения его к Int32, вызывает некоторое странное поведение.Я бы дважды проверил, что тип соответствует фактическому типу параметра.

Если тип REALLY является правильным для объекта и вам действительно нужна динамическая типизация, попробуйте NHibernate «угадайте» типпереданное значениеСреда выполнения всегда должна знать фактический тип объекта, поэтому NH сможет обнаружить это, не указав тип IType (который может быть неправильным).Если вы уверены, что тип правильный, вы также можете рефлексивно вызвать универсальный метод, который работает в тесте:

var setParamMethod = hibQuery.GetType().GetMethod("SetParameter`1");
setParamMethod.MakeGenericMethod(myValueType)
    .Invoke(nhibQuery, new object[]{"UserId", intObject});
0 голосов
/ 06 марта 2011

Почему вы указываете тип явно?

Это должно работать так же хорошо:

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