2010-10-01 56 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