如何将PostGis几何柱映射为wkt和nHibernate,而不使用nHibernate spatial

如何将PostGis几何柱映射为wkt和nHibernate,而不使用nHibernate spatial,nhibernate,postgis,Nhibernate,Postgis,我需要使用nHibernate作为wkt阅读postgis几何专栏。我知道我可以使用nHibernate Spatial,但在我的情况下,这不是一个选项 我看过这篇文章:wkt存储在另一列中,他使用触发器更新实际的几何体。但是,项目所有者不希望为此目的有一个额外的列 我也发现了这条线索:,但没有提供答案 我相信我需要写一个自定义类型,但我真的需要有人给我指出正确的方向。我之前没有使用过Postgresql/postgis Thnx 如果不需要额外的列,可以创建一个视图,该视图将使用函数从原始表中

我需要使用nHibernate作为wkt阅读postgis几何专栏。我知道我可以使用nHibernate Spatial,但在我的情况下,这不是一个选项

我看过这篇文章:wkt存储在另一列中,他使用触发器更新实际的几何体。但是,项目所有者不希望为此目的有一个额外的列

我也发现了这条线索:,但没有提供答案

我相信我需要写一个自定义类型,但我真的需要有人给我指出正确的方向。我之前没有使用过Postgresql/postgis


Thnx

如果不需要额外的列,可以创建一个视图,该视图将使用函数从原始表中提取数据,并在视图上创建一个instead of触发器来更新实际表。

我使用nHibernates sql拦截器解决了这个问题。这不是最健壮的解决方案,但通过这种方式,我可以为PostGis和Oracle提供不同的拦截器

我还研究了nHibernate.spatical和它们的几何类型。但我不想使用NetTopologySuite,因此我需要编写更多的代码

以下是部分代码的示例:

public class PostGisGeometrySqlInterceptor : IInterceptor
{
   ...

    /// <summary>
    /// Modifies all the select statements with geometry so that 
    /// xxx.geometry -> ST_AsText(xxx.geometry)
    /// </summary>
    /// <param name="sql">The original sql string.</param>
    /// <returns>The modified sql string.</returns>
    /// <remarks>
    /// All the geometry fields must be called 'geometry'. 
    /// Works only for one geometry in the sql string.
    /// </remarks>
    public virtual SqlString OnPrepareStatement(SqlString sql)
    {
        if (sql.StartsWithCaseInsensitive("SELECT") && sql.ToString().Contains("geometry"))
        {
            var indexOfGeometry = sql.IndexOfCaseInsensitive("geometry");
            var indexOfSpace = sql.Substring(0, indexOfGeometry).LastIndexOfCaseInsensitive(" ") + 1;

            var oldValue = sql.ToString(indexOfSpace, indexOfGeometry - indexOfSpace + "geometry".Length);
            var newValue = string.Format("ST_AsText({0})", oldValue);
            sql = sql.Replace(oldValue, newValue);
        }
        else if(...)

        ...

        return sql;   
    }
公共类PostGisGeometrySqlInterceptor:IInterceptor
{
...
/// 
///使用几何图形修改所有select语句,以便
///xxx.geometry->ST_AsText(xxx.geometry)
/// 
///原始sql字符串。
///修改后的sql字符串。
/// 
///所有几何体字段必须称为“几何体”。
///仅适用于sql字符串中的一个几何图形。
/// 
公共虚拟SqlString OnPrepareStatement(SqlString sql)
{
if(sql.startsWithCaseSensitive(“选择”)&&sql.ToString()包含(“几何体”))
{
var indexOfGeometry=sql.indexofcase不敏感(“几何”);
var indexOfSpace=sql.Substring(0,indexOfGeometry).lastIndexofCaseSensitive(“”+1;
var oldValue=sql.ToString(indexOfSpace,indexOfGeometry-indexOfSpace+“geometry”.Length);
var newValue=string.Format(“ST_AsText({0})”,oldValue;
sql=sql.Replace(旧值、新值);
}
否则如果(…)
...
返回sql;
}