npgsql到PostGIS添加了:: text,使st_intersects失败

时间:2014-07-08 11:30:30

标签: c#-4.0 nhibernate postgis npgsql

我已经看过很多关于此事的老帖子,但没有明确的解决方案。

我们将PostGreSQL 9.3与PostGIS 2结合使用; NHibernate 3.2.0-GA与Npgsql 2.1.2。 我们有一个使用MySQL Spatial的ASP.NET网站,我们现在正在切换到PostGIS。 我的查询失败是使用以下代码发送给NHibernate:

    string hql = string.Format("select item from {0} item 
      where NHSP.Intersects(item.Polygon,:boundary) 
      and item.Layer = :layer", typeof(Data.Item).Name);
    IQuery query = CurrentSession.CreateQuery(hql);
    query.SetParameter("boundary", boundary, GeometryType);
    query.SetParameter("layer", layer);
    return query.List<Data.Item>();

这应生成如下查询:

    select * from fields
    where layer = 'tst'
    and st_intersects(polygon,
    '0103000020000000000100000005000000F[..]4A40');

但它会生成如下查询:

    select * from fields
    where layer = 'tst'
    and st_intersects(polygon,
    '0103000020000000000100000005000000F[..]4A40'::text);

注意结尾处的:: text。这导致以下异常:

     Npgsql.NpgsqlException: ERROR: 42725: function st_intersects(geometry, text) is not unique

原因是因为第二个参数作为文本发送到PostGIS而不是几何。

我改变了NH Spatial库中的一些代码,如其他地方所建议的那样: 我将这些行添加到GeometryTypeBase.cs(NHibernate.Spatial)

    protected GeometryTypeBase(NullableType nullableType, SqlType sqlTypeOverwrite)
        : this(nullableType)
    {
        this.sqlType = sqlTypeOverwrite;
    }

并改变了

    public PostGisGeometryType()
        : base(NHibernateUtil.StringClob)
    {
    }

    public PostGisGeometryType()
        : base(NHibernateUtil.StringClob, new NHibernate.SqlTypes.SqlType(System.Data.DbType.Object))
    {
    }
PostGisGeometryType.cs(PostGIS驱动程序)中的

当我运行我的应用程序时,我现在在

上获得了一个强制转换异常
    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        this.nullableType.NullSafeSet(cmd, this.FromGeometry(value), index);
    }

也在GeometryTypeBase.cs(NHibernate.Spatial)中:

    System.InvalidCastException: Can't cast System.String into any valid DbType.

非常感谢任何有关如何解决此问题的建议。

1 个答案:

答案 0 :(得分:1)

我一直在搜索和更改我的搜索字符串我在https://github.com/npgsql/Npgsql/issues/201

中找到了答案

在NpgsqlTypes.NpgsqlTypesHelper.cs

    nativeTypeMapping.AddType("text_nonbinary", NpgsqlDbType.Text, DbType.Object, true);
    nativeTypeMapping.AddDbTypeAlias("text_nonbinary", DbType.Object);

需要更改为

    nativeTypeMapping.AddType("unknown", NpgsqlDbType.Text, DbType.Object, true);
    nativeTypeMapping.AddDbTypeAlias("unknown", DbType.Object);

还需要完成我之前对PostGisGeometryType的修复。 现在我终于可以从PostGIS获取我的几何数据。