NHibernate 2.0.1 Критерии: исключение исключения из ограничения IsNull - PullRequest
1 голос
/ 16 ноября 2008

Я использовал NHibernate 2.0.1.4000 во всех текущих проектах .NET 3.5 с пакетом обновления 1 (SP1) и у меня не было проблем с любыми другими запросами (с использованием API запросов или критериев), пока какая-то новая бизнес-логика не диктовала необходимость нового запроса в этом конкретном проекте для базы данных приложения, которая должна извлекать записи с определенным нулевым свойством (типа DateTime) из одной таблицы.

Зная, что вы не можете использовать неравноправное ограничение для этого типа запроса, но вместо этого можете использовать ограничение IsNull, этот простой запрос генерирует «Значение не может быть нулевым!» Исключение при исполнении. У меня есть обширные файлы журналов log4net в режиме DEBUG, которые я просмотрел и пока не помог, и я убедился, что мой класс для таблицы действительно определяет свойство, для которого я проверяю, является свойством обнуляемого типа (DateTime?), Чтобы избежать проблемы, которые могут быть вызваны принудительным обновлением записи и т. д., чего здесь не происходит ...

Вот запрос, ничего сложного, и я пробовал с / без дополнительного ограничения MaxResults, чтобы устранить его как проблему, и все же, каждый раз, исключение выдается до того, как я смогу собрать результаты:

ICriteria criteria = session.GetISession().CreateCriteria(typeof (Order)).Add(NHibernate.Criterion.Restrictions.IsNull("ShippedOn")).SetMaxResults(10);

IList<Order> entityList = criteria.List<Order>();

Какие-нибудь идеи или указатели на дополнительную информацию, которые могут помочь мне решить эту проблему? Я попытался использовать HQL в качестве альтернативы, те же проблемы ... Я что-то упустил здесь в отношении возврата записей с определенным нулевым свойством?

Ответы [ 3 ]

0 голосов
/ 23 декабря 2008

Я встречал такого рода исключения раньше, когда было несоответствие между вашей моделью домена, отображением и базой данных. Например, если в вашей базе данных есть поле типа DateTime со значением NULL, но в вашей модели нет значения NULL.

Я описал это в посте в моем блоге некоторое время назад. Не могу точно сказать, что это ваша проблема, но она звучит знакомо.

0 голосов
/ 03 января 2009

DateTimes не обнуляются в .net. Вы пытались изменить модель своего домена, чтобы использовать DateTime? что обнуляется?

Подобные исключения можно получить с помощью критериальных запросов. Предположим, у меня есть объект домена Person со строковым свойством с именем Name. Я могу построить следующие критерии:

ICriteria criteria = session.CreateCriteria(typeof(Person)
.Add(Restrictions.Eq(1234))

однако, я перечисляю этот критерий, NHibernate выдает исключение несоответствия типов, потому что я проверяю строку на int. За кулисами NHIbernate делает некоторую умную рефлексивную проверку типов на отображаемых объектах и ​​будет выдавать исключения, если типы не совпадают. (вы, вероятно, получили бы SqlException, если бы он не был таким умным)

0 голосов
/ 19 ноября 2008

Быстрое обновление ... но после дальнейшего исследования выясняется, что Expection фактически выбрасывается, когда транзакция и единица работы завершены, и вызывается метод сеанса .Flush (), который снова как-то связан с NHibernate пытается разобраться со значением NULL в табличном поле / свойстве DAO. Который, хотя я обработал в своем классе и отображении для соответствующей таблицы, фактический SQL, который генерирует мой критерий с ограничениями, вызывает исключение на Flush из-за проблемы SqlDateTime ...

В настоящее время мой обходной путь заключается в получении записей из моего первого ограничения и обработке проверки IsNull в коде вместо запроса. Не так эффективно, но пока я не разберусь, это работает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...