NHibernate 2.0.1标准:IsNull限制抛出异常

时间:2008-11-16 03:24:27

标签: nhibernate exception criteria

我一直在所有当前的.NET 3.5 SP1项目上使用NHibernate 2.0.1.4000,并且在使用Query或Criteria API之前没有遇到任何问题,直到一些新的业务逻辑决定了针对应用程序数据库的此特定项目中的新查询,该数据库需要从单个表中检索具有特定null属性(类型为DateTime)的记录。

知道你不能对这种类型的查询使用不等于限制,但是可以使用IsNull限制,这个简单的查询生成一个“值不能为空!”执行时出现异常。我有广泛的DEBUG模式log4net日志文件,我已经审查过但还没有帮助,我已经验证我的表的类确实指定我正在检查的属性是一个可以为空的属性(DateTime?)以避免通过强制更新记录等可能导致的问题,这在这里没有发生...

这是查询,没有什么复杂的,我尝试使用/不使用MaxResults额外的限制来消除它作为一个问题,然而,每次,在我收集结果之前抛出异常:

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

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

任何可能有助于我解决此问题的更多信息的想法或指示?我曾经尝试过使用HQL,同样的问题......我在这里错过了关于返回具有特定null属性的记录的内容吗?

3 个答案:

答案 0 :(得分:0)

快速更新......但经过进一步调查后结果显示,当事务和工作单元完成时,Expection实际上被抛出,并调用session.Flush()方法,并且再次以某种方式与如何关联NHibernate试图处理可以为空的表字段/ DAO属性。即使我已经在我的类中处理并映射适用的表,实际的SQL我的限制条件是生成,导致异常被Flush抛出SqlDateTime问题......

目前,我的解决方法是从我的第一个限制中检索记录,并在代码而不是查询中处理IsNull检查。不是那么高效,但在我弄明白之前,它正在发挥作用......

答案 1 :(得分:0)

在您的域模型,映射和数据库之间存在不匹配之前,我已经看到过这种异常。例如,如果数据库中有可为空的DateTime字段,但模型上没有可为空的属性。

我前一段时间在a post on my blog描述了它。我不能肯定这是你的问题,但它听起来确实很熟悉。

答案 2 :(得分:0)

.net中的DateTimes不可为空。您是否尝试过更改域模型以使用DateTime?哪个可空?

您可以使用条件查询获得类似的异常。假设我有一个Person域对象,其中包含一个名为Name的字符串属性。我可以构建以下标准:

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

然而,我列出了这个标准NHibernate将抛出一个类型不匹配异常,因为我正在测试一个针对int的字符串。在幕后,NHIbernate会对映射的对象进行一些巧妙的反射类型检查,如果类型没有排列,则会抛出异常。 (如果它不聪明,你可能会得到一个SqlException)