2010-10-01 57 views
3

我有一個NHibernate和postgresql POINT數據類型的問題(儘管我相信這是所有這些的常見問題試圖映射一個沒有被NHibernate SqlTypes覆蓋的SQL TYPE)。爲POINT postgresql數據類型(或任何非原始類似nhibernate類型的列)實現新的NHibernate類型

我的Data.Point類有兩個公共浮點數:xcoordinate和ycoordinate。

我第一次嘗試是想貫徹IUserType接口,但我很快就發現,問題就來了較早,在映射階段:

MappingException是未處理由用戶代碼:
無法確定類型爲:Data.PointUserType,Data.Point,爲列:NHibernate.Mapping.Column(座標)

我很新的NHibernate的,但在我看來,我只能創建一個新的類型,如果該數據庫中的列是已知類型(float,int,var字符和所有「經典」類型,但不是我需要的幾何類型)。

我已經設法通過映射到座標[0]和座標[1]將我的POINT映射到兩個不同的屬性。但是這隻對SELECT和UPDATE查詢有用,對於INSERT,postgresql會抱怨「座標」不可爲空。另外,我找不到NHibernate Spatial擴展的實際版本,我寧願控制我的POINT類型,因爲我很少使用這種類型,因此我寧願不加載整個NHibernate Spatial程序集(假設它們是積極開發的,否則我會遠離它們)。我最後的想法是我需要搞亂NHibernate的SQL生成(因爲插入SQL的某些部分將是'(a,b)':: point,非常具體),也許這是一個太麻煩了(也許不是,我會願意檢查出來)。

我對NHibernate相當新,但我越來越絕望。 任何人都可以指點我嗎?

+0

我知道這是一個有點晚,但均你能做到嗎?我試圖在Nhibernate中映射postgresql Point類型,有或沒有NH.Spatial,我一直在找你的問題。 – 2013-11-25 10:46:36

+1

確實,我有,但有些事情需要注意。請通過gmail dot com的mzabani與我聯繫。 – 2013-11-25 13:46:01

回答

1

我最近買了NHibernate的使用SQL Server 2008的工作,看看是怎麼看這個問題:NHibernate.Spatial and Sql 2008 Geography type - How to configure

這將是更容易幫助,如果你提供你的映射文件。我想知道你是否正確地註冊了你的IUserType?它應該是這個樣子

<class name="WhereAmI"> 
    <property name="Point"> 
     <type name="MyProject.MyPointUserType, MyProject"> 
     </type> 
    </property> 
</class> 

也可以考慮考慮看看下面IUserType實現其適用於MS SQL Servier公司2008年:NHibernate.Spatial.Type.GeometryType

+0

感謝您的回答,最近發佈了NHibernate Spatial版本(經過很長時間)。似乎Spatial正在開發中(儘管發佈不太頻繁)。然而,我寧願實現我自己的POINT數據類型,而不是包含大量的庫來管理這種類型,我將很少使用..對此有什麼想法? – 2010-11-02 19:09:25

+0

我並沒有真正有資格評論滾動自己,因爲我從來沒有這樣做過。但是我快速瀏覽了nHibernate。空間代碼,它看起來不平凡。那麼滾動自己的價值的好處呢?我懷疑不是 – Iain 2010-11-03 02:46:51

+0

這是一個非常好的觀點,我擔心這會是這種情況(實現我想要的是不平凡的)。在這種情況下,我不得不選擇使用原始SQL進行插入,而使用NHibernate通過映射到座標[0]和座標[1]或使用Spatial完成SELECT和UPDATE。你怎麼看? – 2010-11-03 15:13:11