1

我一直在使用NHibernate 2.0.1.4000所有当前的 .NET 3.5 SP1 项目,并且在使用任何其他查询(使用 Query 或 Criteria API)时都没有遇到任何问题,直到一些新的业务逻辑要求在这个特定项目中针对应用程序的数据库,需要从单个表中检索具有特定空属性(日期时间类型)的记录。

知道您不能对此类查询使用不等于限制,而是可以使用 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,同样的问题......我在这里遗漏了一些关于返回具有特定空属性的记录的内容吗?

4

3 回答 3

0

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

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

于 2008-11-18T22:32:24.850 回答
0

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

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

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

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

于 2009-01-02T23:12:28.523 回答
0

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

不久前,我在我的博客上的一篇文章中描述了它。我不能肯定这是你的问题,但它肯定听起来很熟悉。

于 2008-12-23T12:47:46.290 回答