2011-06-29 15 views
6

とバイトプロパティは、クエリバイトプロパティNHibernateは3.1.0.4000に問題があります:クエリNHibernateの原因無効なキャストエラー

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

例外の詳細/スタックトレースを投稿してください。 – Jay

答えて

6

私は取得していますが、このようなLinq2Nhibernateクエリを使用してNHibernateの同じバージョンと同じエラー:この場合

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

LineIndexは、.NET Byte(ヌル入力不可)としてマップされます。私のスタックトレースの先頭には、次のようになります

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

だから、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方法は次のようになりますキャスト。興味深いことに、1という文字をbyteにキャストしても、同じエラーが表示されます。私がconst byteを使用した場合も同様です。だから、私はそれがbyteを取ってそれと変なことをしているスタックの上にあると思う。

フィールドがヌル入力可能でない場合は、NullSafeSetを実行していることが特に興味深いです。実験として、LineIndexプロパティをintに変更しましたが、無効なキャスト例外が発生しませんでした。これはNHibernateのバグのようです。これをNHibernateバグトラッカーに貼り付けようとします。

編集this similar bug NH-2485が非問題として閉鎖されたことを

注意。

他の類似/重複バグ:バイトの

  • NH-2789 LINQクエリ?

    • NH-2812 null以外のバイトプロパティにLINQクエリを実行InvalidCastExceptionが

    編集をスロー:シンプルなプロパティは、MSSQL 2005(tinyint型)

私はこのバグを提出した上で失敗します

バージョン3.3.1以降ではこの問題が解決されています。

2

ちょうど私はNHibernateの3.2.x.で、今日、この正確な問題があったshort代わりのbyte

1

を使用Scott Whitlockのリストにあるバグはfixed in 3.3.xとマークされており、NHibernateのアップグレードがこの問題を解決したことを確認できます。

関連する問題