我已经看过很多关于此事的老帖子,但没有明确的解决方案。
我们将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.
非常感谢任何有关如何解决此问题的建议。
答案 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获取我的几何数据。