2011-06-29 12 views
6

Czy jest jakiś problem z NHibernate 3.1.0.4000 gdzie kwerendy właściwość bajt:Zapytanie właściwość bajt z błędem nieważny szarego NHibernate przyczyna

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

tekst Wyjątek:

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 
+1

Proszę zaksięgować szczegóły wyjątku/ślad stosu. – Jay

Odpowiedz

6

Otrzymuję sam błąd z tej samej wersji NHibernate przy użyciu kwerendy Linq2Nhibernate takiego:

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

w tym przypadku LineIndex jest mapowany jako .NET Byte (nie może być bezzasadny). W górnej części mojego śladu stosu wygląda następująco:

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 
... 

Patrząc na źródła, metoda Set wygląda następująco:

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

Więc próbuje oddać obiekt do byte i coraz nieprawidłowy odlew. Co ciekawe, kiedy rzuciłem mój literalny 1 do byte, nadal mam ten sam błąd. Dzieje się tak również, jeśli używam const byte. Dlatego myślę, że jest to coś wyżej na stosie, który bierze byte i robi coś dziwnego z tym.

Szczególnie interesujące jest to, że robi się NullSafeSet, gdy pole nie jest zerowalne. W ramach eksperymentu zmieniłem właściwość LineIndex na int i nie otrzymałem wyjątku dotyczącego nieprawidłowego przesyłania. Wygląda na to, że jest to błąd w NHibernate. Spróbuję włożyć to w moduł śledzenia błędów NHibernate.

Edit

this similar bug NH-2485 Zauważ, że została zamknięta jako non-wydania.

Inny podobny/nakładających bug: zapytanie

  • NH-2789 LINQ na bajt? prosty nieruchomość nie na MSSQL 2005 (TINYINT)

złożyłam ten błąd:

  • NH-2812 Wykonywanie kwerendy Linq na niepuste własności bajtów zgłasza InvalidCastException

Edycja

Wersja 3.3.1 i wyższa rozwiązuje ten problem.

2

short Wystarczy użyć zamiast byte

1

miałem dzisiaj dokładnie ten problem z NHibernate 3.2.x. Błędy wymienione przez Scotta Whitlocka zostały oznaczone jako fixed in 3.3.x i mogę potwierdzić, że uaktualnienie NHibernate rozwiązało ten problem.

Powiązane problemy