NHibernate 2.0.1标准:IsNull限制引发异常

NHibernate 2.0.1标准:IsNull限制引发异常,nhibernate,exception,criteria,Nhibernate,Exception,Criteria,我在所有当前的.NET 3.5 SP1项目上都使用了NHibernate 2.0.1.4000,并且没有任何其他查询问题(使用查询或条件API),直到一些新的业务逻辑规定了在这个特定项目中对应用程序数据库进行新查询的必要性,该数据库需要从单个表中检索具有特定null属性(类型为DateTime)的记录 知道不能对这种类型的查询使用not equal限制,而是可以使用IsNull限制,此简单查询在执行时会生成“Value cannot be null!”异常。我有大量的调试模式log4net日志文

我在所有当前的.NET 3.5 SP1项目上都使用了
NHibernate 2.0.1.4000
,并且没有任何其他查询问题(使用查询或条件API),直到一些新的业务逻辑规定了在这个特定项目中对应用程序数据库进行新查询的必要性,该数据库需要从单个表中检索具有特定null属性(类型为DateTime)的记录

知道不能对这种类型的查询使用not equal限制,而是可以使用IsNull限制,此简单查询在执行时会生成“Value cannot be null!”异常。我有大量的调试模式log4net日志文件,我已经查看了这些文件,但还没有提供帮助,并且我已经验证了我的表类是否指定了我要检查的属性是可为null的属性(DateTime?),以避免强制更新记录等可能导致的问题,这里没有发生这种情况

这是一个查询,并不复杂,我尝试使用/不使用MaxResults附加限制来消除它作为一个问题,但每次都会在我收集结果之前抛出异常:

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

IList<Order> entityList = criteria.List<Order>();
ICriteria criteria=session.GetISession().CreateCriteria(typeof(Order)).Add(NHibernate.criteria.Restrictions.IsNull(“ShippedOn”).SetMaxResults(10);
IList entityList=criteria.List();

有什么想法或建议可以帮助我解决这个问题吗?我尝试过交替使用HQL,同样的问题。。。关于返回具有特定null属性的记录,我是否遗漏了一些内容?

快速更新…但经过进一步调查,事实证明,当事务和工作单元完成时,实际会抛出预期,并调用session.Flush()方法,这又与NHibernate如何处理可为空的表字段/DAO属性有关。尽管我已经在类中处理了相应表的映射,但我的条件和限制正在生成的实际SQL会导致SqlDateTime问题在刷新时引发异常


目前,我的解决方法是从第一个限制中检索记录,并在代码中处理IsNull检查,而不是查询。性能没有那么好,但在我弄清楚之前,它正在工作…

我以前见过这样的异常情况,当您的域模型、映射和数据库之间存在不匹配时。例如,如果数据库中有一个可为null的DateTime字段,但模型上没有可为null的属性


我不久前描述过。我不能肯定这是你的问题,但听起来确实很熟悉。

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

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

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

然而,我列出了这个条件,因为我正在测试一个字符串与一个int的比较,所以NHibernate会抛出一个类型不匹配异常。在幕后,NHibernate会对映射对象进行一些巧妙的反射类型检查,如果类型没有对齐,就会抛出异常。(如果不是这么聪明的话,你可能会得到一个SqlException)

死链接,fwiw。这正是这个答案。如果你读了这篇博文,除了讲故事之外,没有什么额外的信息。在提出这些建议时,请记住这篇文章是在2008年发表的,远远早于Stack Overflow发展到今天的回答礼仪。如果您觉得答案可以改进,请随意建议编辑。