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