Я получаю ту же ошибку с той же версией NHibernate, используя запрос Linq2Nhibernate, например:
var details =
(from d in repository.AllEntities
where (d.OtherTable.Field == someCriteria && d.LineIndex == 1)
select d).ToList();
В этом случае LineIndex
отображается как .NET 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
выглядит следующим образом:
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.
Edit
Обратите внимание, что эта похожая ошибка NH-2485 была закрытане проблема.
Другая похожая / перекрывающаяся ошибка:
- NH-2789 LINQ-запрос на байт?простое свойство не выполняется в MSSQL 2005 (tinyint)
Я отправил эту ошибку:
- NH-2812 Выполнение запроса Linq для ненулевого значенияСвойство byte создает исключение InvalidCastException
Edit
версии 3.3.1 и более поздних версий, решает эту проблему.