Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用nhibernate查询字节属性导致无效强制转换错误_C#_Linq_Nhibernate - Fatal编程技术网

C# 使用nhibernate查询字节属性导致无效强制转换错误

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.

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.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解决了此问题。

请发布异常详细信息/堆栈跟踪。