C# 使用nhibernate查询字节属性导致无效强制转换错误
nhibernate 3.1.0.4000查询字节属性时是否存在任何问题:C# 使用nhibernate查询字节属性导致无效强制转换错误,c#,linq,nhibernate,C#,Linq,Nhibernate,nhibernate 3.1.0.4000查询字节属性时是否存在任何问题: byte code = 2; Group g = Repository<Group>.FindOne(p => p.Code == code); 我使用Linq2Nhibernate查询得到相同版本的NHibernate的相同错误,如下所示: var details = (from d in repository.AllEntities where (d.OtherTable.
byte code = 2;
Group g = Repository<Group>.FindOne(p => p.Code == code);
我使用Linq2Nhibernate查询得到相同版本的NHibernate的相同错误,如下所示:
var details =
(from d in repository.AllEntities
where (d.OtherTable.Field == someCriteria && d.LineIndex == 1)
select d).ToList();
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
...
public override void Set(IDbCommand cmd, object value, int index)
{
((IDataParameter) cmd.Parameters[index]).Value = (byte) value;
}
在这种情况下,LineIndex
被映射为.NET字节(不可为空)。堆栈跟踪的顶部如下所示:
var details =
(from d in repository.AllEntities
where (d.OtherTable.Field == someCriteria && d.LineIndex == 1)
select d).ToList();
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
...
public override void Set(IDbCommand cmd, object value, int index)
{
((IDataParameter) cmd.Parameters[index]).Value = (byte) value;
}
查看源代码,Set
方法如下所示:
var details =
(from d in repository.AllEntities
where (d.OtherTable.Field == someCriteria && d.LineIndex == 1)
select d).ToList();
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
...
public override void Set(IDbCommand cmd, object value, int index)
{
((IDataParameter) cmd.Parameters[index]).Value = (byte) value;
}
因此,它试图将对象强制转换为字节
,并获得无效强制转换。有趣的是,当我将文字1
转换为字节时,仍然会得到相同的错误。如果使用常量字节
,也会发生这种情况。因此,我认为是更高层次的东西占用了字节
,并用它做了一些奇怪的事情
特别有趣的是,当字段不可为空时,它正在执行一个NullSafeSet
。作为实验,我将我的LineIndex
属性更改为int
,并且没有得到无效的强制转换异常。这似乎是NHibernate中的一个bug。我会把这个贴在NHibernate的bug追踪器上
编辑
请注意,已作为非问题关闭
其他类似/重叠错误:
- 字节上的LINQ查询?MSSQL 2005(tinyint)上的简单属性失败
我提交了这个bug:
- 对非空字节属性执行Linq查询会引发InvalidCastException
编辑
版本3.3.1和更高版本解决了这个问题。只需使用short
而不是byte
我今天在NHibernate 3.2.x上遇到了这个问题。Scott Whitlock列出的bug标记为,我可以确认升级NHibernate解决了此问题。请发布异常详细信息/堆栈跟踪。