У меня возникли некоторые проблемы с атрибутом SqlNamedQuery, который был добавлен в более новую версию Castle's ActiveRecord. Я указал это так:
[assembly: SqlNamedQuery(Queries.GetItemName, "EXEC [dbo].[GetItemName] :id")]
Кроме того, у меня есть свойство в отображении результата, объявленное как:
...
[Property(Access = PropertyAccess.AutomaticProperty, NotNull = true)]
public virtual bool IsPrimaryName { get; set; }
...
Запрос Nhibernate:
IQuery query = Session.GetNamedQuery(Queries.GetItemName);
query.SetParameter("id", 1212, NHibernateUtil.Int64);
query.SetResultTransformer(Transformers.AliasToBean<Mapping>());
После исполнения я получаю следующее исключение:
Object of type 'System.Int32' cannot be converted to type 'System.Boolean'.
Я также добавил приведенную ниже запись web.config, но безуспешно (возможно, это относится только к hql-запросам).
<add key="query.substitutions" value="true 1, false 0, yes 'Y', no 'N'" />
Итак, мой вопрос - как я могу решить эту проблему? Хранимая процедура возвращает 0 или 1, но я также пытался использовать «1», «true», «TRUE» и т. Д. Как мне обойти это? Или, может быть, я должен просто отбросить SqlNamedQueries?
ОБНОВЛЕНИЕ: трассировка стека
[ArgumentException: Object of type 'System.Int32' cannot be converted to type 'System.Boolean'.]
System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast) +4070954
System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) +9631414
System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) +151
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +223
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +28
System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) +101
System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index) +25
NHibernate.Properties.BasicSetter.Set(Object target, Object value) +68
ОБНОВЛЕНИЕ: Выберите оператор:
SELECT
itm.ItemId AS ItemId,
itm.Value AS Value,
itm.Id AS ParentId,
1 AS IsPrimaryName
FROM
[dbo].[Item] AS itm
...
Как я уже упоминал выше, я пробовал несколько различных сценариев на стороне sp, в том числе: '1', 'true', 'TRUE' + объявление переменной BIT и ее возврат непосредственно из оператора select, но все это завершается ошибкой с аналогичным исключением.
Thx!