gpt4 book ai didi

c# - 使用 nhibernate 查询字节属性会导致无效的转换错误

转载 作者:太空狗 更新时间:2023-10-29 21:19:26 28 4
gpt4 key购买 nike

nhibernate 3.1.0.4000 where query a byte property有没有问题:

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

最佳答案

我在相同版本的 NHibernate 上使用 Linq2Nhibernate 查询时遇到同样的错误,如下所示:

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

在这种情况下,LineIndex 被映射为 .NET Byte(不可为 null)。我的堆栈跟踪顶部如下所示:

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 错误跟踪器上。

编辑

请注意 this similar bug NH-2485已作为非问题关闭。

其他类似/重叠的错误:

  • NH-2789 LINQ查询字节?简单属性在 MSSQL 2005 (tinyint) 上失败

我提交了这个错误:

  • NH-2812对非空字节属性执行 Linq 查询会抛出 InvalidCastException

编辑

版本 3.3.1 及更高版本解决了此问题。

关于c# - 使用 nhibernate 查询字节属性会导致无效的转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6521285/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com