为POINT postgresql数据类型(或任何非原始类似nhibernate类型的COLUMN)实现新的NHibernate类型

时间:2010-10-01 02:48:27

标签: .net sql nhibernate nhibernate-mapping sql-types

我有NHibernate和postgresql POINT数据类型的问题(虽然我认为这是所有那些尝试映射NHPEnate SqlTypes未涵盖的SQL TYPE的常见问题)。

我的Data.Point类有两个公共浮点数:xcoordinate和ycoordinate。

我的第一次尝试是尝试实现IUserType接口,但我很快发现问题出现在映射阶段:

  

MappingException未被用户代码处理:
  无法确定类型:Data.PointUserType,Data.Point,用于列:NHibernate.Mapping.Column(coordinates)

我对NHibernate很新,但在我看来,如果数据库中的列是已知类型(float,int,varchar和所有“经典”类型之一),我只能创建一个新类型,但不是我需要的几何形状。

我设法通过映射到坐标[0]和坐标[1]将我的POINT映射到两个不同的属性。但这仅对SELECT和UPDATE查询有用,因为INSERT postgresql会抱怨“坐标”不可为空。

另外,我找不到NHibernate Spatial扩展的实际版本,而且我更倾向于控制我的POINT类型,因为我很少使用这种类型,因此我宁愿不加载整个NHibernate Spatial程序集(假设它们是积极开发的,否则我会远离它们。)

我最后的想法是,我需要搞乱NHibernate的SQL生成(因为插入SQL的某些部分将是'(a,b)':: point ,非常具体),也许这有点太麻烦了(也许不是,我愿意检查一下)。

我对NHibernate相当新,但我变得绝望了。 有人能指点我吗?

1 个答案:

答案 0 :(得分: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>

另请考虑查看适用于MS SQL Servier 2008的以下IUserType实现:NHibernate.Spatial.Type.GeometryType