Замок ActiveRecord: «System.Int32» не может быть преобразован в тип «System.Boolean» - PullRequest
2 голосов
/ 27 июня 2011

У меня возникли некоторые проблемы с атрибутом 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!

Ответы [ 3 ]

5 голосов
/ 27 июня 2011

Подстановки запросов используются для сопоставления литералов HQL с SQL, поэтому здесь они не помогут.

Ваша трассировка стека неполна (вы съели внутреннее исключение), поэтому я не могу быть уверен, но я предполагаю, что ошибка в том, что GetItemName возвращает столбец int, который вы пытаетесь сопоставить с bool собственность.

Можете ли вы опубликовать соответствующий SELECT от SP и ваш класс DTO Mapping (Это IS DTO, а не сопоставленная сущность, верно?)


Обновление: ваш оператор SELECT нуждается в приведении

SELECT ...
       CAST(1 as bit) IsPrimaryName
FROM ...
0 голосов
/ 27 июня 2011

SQL Server поддерживает логические типы IIRC, так почему бы вам просто не переписать хранимую процедуру «GetItemName», чтобы вместо нее было возвращено логическое значение?

В противном случае, я думаю, вам нужно изменить диалект, чтобы он поддерживал 1/0 вместо true / false.

0 голосов
/ 27 июня 2011

Именованные запросы хороши, если вы уверены, что хранимые процедуры принесут вам дополнительные преимущества по сравнению со специальными запросами. Параметр Query.substitution преобразовывает данные для SQL-запроса, а не обратно. Не могли бы вы показать стек вызовов, пожалуйста?

...