2011-06-29 7 views
6

¿Hay algún problema con nhibernate 3.1.0.4000 donde consulta una propiedad de bytes:consulta una propiedad de byte con la causa de error nhibernate reparto no válido

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

Texto de excepción:

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

Por favor, publique el detalle de la excepción/seguimiento de la pila. – Jay

Respuesta

6

estoy recibiendo la mismo error con la misma versión de NHibernate mediante una consulta Linq2Nhibernate así:

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

En este caso, LineIndex está correlacionado como .NET Byte (no anulable). La parte superior de mi seguimiento de la pila se ve así:

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

En cuanto a la fuente, el método Set se ve así:

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

por lo que es tratar de convertir un objeto a un byte y conseguir un inválido emitir. Curiosamente cuando lanzo mi literal 1 a byte, sigo recibiendo el mismo error. También sucede si uso un const byte. Por lo tanto, creo que es algo superior en la pila que está tomando el byte y está haciendo algo extraño con él.

Es particularmente interesante que está haciendo un NullSafeSet, cuando el campo no es nulo. Como experimento, cambié mi propiedad LineIndex a int y no obtuve la excepción de conversión no válida. Esto parece ser un error en NHibernate. Trataré de pegar esto en el rastreador de errores NHibernate.

Editar

Tenga en cuenta que this similar bug NH-2485 se cerró como un no-tema.

Otros similares/fallo se superponen: consulta

  • NH-2789 LINQ en bytes? simple propiedad falla en MSSQL 2005 (tinyint)

presenté este error:

  • NH-2812 Realizar una consulta LINQ en una propiedad de byte no nulo, se emite una InvalidCastException

Editar

La versión 3.3.1 y superior resuelve este problema.

2

sólo tiene que utilizar en lugar de shortbyte

1

tuve este problema exacto hoy con NHibernate 3.2.x. Los errores enumerados por Scott Whitlock se marcaron como fixed in 3.3.x, y puedo confirmar que la actualización de NHibernate resolvió este problema.

Cuestiones relacionadas