Запросить свойство байта с помощью nhibernate, причина ошибки неверного приведения - PullRequest
6 голосов
/ 29 июня 2011

Есть ли проблема с nhibernate 3.1.0.4000, где запросить свойство байта:

byte code = 2;
Group g = Repository<Group>.FindOne(p => p.Code == code);

Текст исключения:

Cause 'Specified cast is not valid.'

[InvalidCastException: Specified cast is not valid.]
   NHibernate.Type.ByteType.Set(IDbCommand cmd, Object value, Int32 index) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\ByteType.cs:44
   NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\NullableType.cs:180
...

[GenericADOException: could not execute query
[ select group0_.LabourLawGroupId as LabourLa1_235_, group0_.Code as Code235_ from personnel.LabourLawGroup group0_ where group0_.Code=? ]
  Name:p1 - Value:4
[SQL: select group0_.LabourLawGroupId as LabourLa1_235_, group0_.Code as Code235_ from personnel.LabourLawGroup group0_ where group0_.Code=?]]
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:1703
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:1601
   NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:1591
   NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR\Loader\QueryLoader.cs:300
   NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:108
   NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Query\HQLQueryPlan.cs:78
   NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:645
   NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\AbstractSessionImpl.cs:92
   NHibernate.Impl.ExpressionQueryImpl.List() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionQueryImpl.cs:60
   NHibernate.Linq.NhQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:79
   NHibernate.Linq.NhQueryProvider.Execute(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:103
   System.Linq.Queryable.SingleOrDefault(IQueryable`1 source) +265
   Azarakhsh.Framework.Repository.NHibernateRepository`1.FindOne(Expression`1 expression) +223
   Azarakhsh.Framework.Repository.Repository`1.FindOne(Expression`1 expression) +100

Ответы [ 3 ]

6 голосов
/ 28 июля 2011

Я получаю ту же ошибку с той же версией NHibernate, используя запрос Linq2Nhibernate, например:

var details =
    (from d in repository.AllEntities
        where (d.OtherTable.Field == someCriteria && d.LineIndex == 1)
        select d).ToList();

В этом случае LineIndex отображается как .NET Byte (необнуляемый).Вершина моей трассировки стека выглядит следующим образом:

NHibernate.Type.ByteType.Set(IDbCommand cmd, Object value, Int32 index) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\ByteType.cs: line 44
NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\NullableType.cs: line 180
NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\NullableType.cs: line 139
NHibernate.Engine.QueryParameters.BindParameters(IDbCommand command, Int32 start, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\QueryParameters.cs: line 630
...

Глядя на источник, метод Set выглядит следующим образом:

public override void Set(IDbCommand cmd, object value, int index)
{
    ((IDataParameter) cmd.Parameters[index]).Value = (byte) value;
}

Итак, он пытается привести объект кbyte и получение неверного приведения.Интересно, что когда я преобразую свой литерал 1 в byte, я все равно получаю ту же ошибку.Это также происходит, если я использую const byte.Поэтому я думаю, что это что-то выше стека, которое берет byte и делает что-то странное с ним.

Особенно интересно, что он делает NullSafeSet, когда поле не обнуляется.В качестве эксперимента я изменил свое свойство LineIndex на int и не получил исключение недопустимого приведения.Это похоже на ошибку в NHibernate.Я попытаюсь прикрепить это на баг-трекер NHibernate.

Edit

Обратите внимание, что эта похожая ошибка NH-2485 была закрытане проблема.

Другая похожая / перекрывающаяся ошибка:

  • NH-2789 LINQ-запрос на байт?простое свойство не выполняется в MSSQL 2005 (tinyint)

Я отправил эту ошибку:

  • NH-2812 Выполнение запроса Linq для ненулевого значенияСвойство byte создает исключение InvalidCastException

Edit

версии 3.3.1 и более поздних версий, решает эту проблему.

2 голосов
/ 23 марта 2012

Просто используйте short вместо byte

1 голос
/ 21 июня 2012

У меня была именно эта проблема сегодня с NHibernate 3.2.x. Ошибки, перечисленные Скоттом Уитлоком, были помечены как , исправленные в 3.3.x , и я могу подтвердить, что обновление NHibernate решило эту проблему.

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