2008-11-16 55 views
1

我一直在使用NHibernate 2.0.1.4000所有當前的.NET 3.5 SP1項目,並沒有任何其他查詢(使用Query或Criteria API)的問題,直到一些新的業務邏輯決定了在這個特定項目中對於需要從單個表中檢索具有特定null屬性(類型DateTime)的應用程序的數據庫的新查詢的必要性。NHibernate 2.0.1條件:IsNull限制拋出異常

由於知道您不能對此類查詢使用不等於限制,而是可以使用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屬性的記錄的東西嗎?

回答

0

快速更新...但事後經過進一步調查後發現,當事務和工作單元完成時,實際上會拋出Expection,並調用會話.Flush()方法,並且再次涉及到NHibernate如何試圖處理可空的表字段/ DAO屬性。即使我已經在我的類中處理並映射了適用的表,實際的SQL我的標準與限制正在生成,導致異常在SqlDateTime問題上拋出在Flush上...

現在,我的解決方法是從我的第一個限制中檢索記錄,並在代碼中處理IsNull檢查而不是查詢。不是性能,但直到我弄明白,它的工作...

0

我以前見過這種異常之前,當你的域模型,映射和數據庫之間不匹配。例如,如果數據庫中有一個可爲空的DateTime字段,但不是模型的可空屬性。

我在a post on my blog後面描述了它。我無法確定這是你的問題,但它聽起來很熟悉。

+0

死鏈接,fwiw。 [Archive.org](https://web.archive.org/web/20090402133829/http://blog.jagregory.com/2007/12/18/nhibernate-and-the-sqltypeexception) – ruffin 2014-05-12 21:25:32

0

DateTime在.net中不可爲空。您是否嘗試過更改域模型以使用DateTime?哪些是可空的?

使用條件查詢可以得到類似的例外。假設我有一個名爲Name的字符串屬性的Person域對象。我可以構建下列條件:

不過是我列出這個標準的NHibernate會拋出一個類型不匹配的異常,因爲我測試對一個int一個字符串。在幕後NHIbernate會對映射對象進行一些巧妙的反射類型檢查,如果類型不對齊,將會拋出異常。 (如果不是這個聰明的話你可能會得到一個SqlException)