当前位置: 首页 > 知识库问答 >
问题:

如何使用nHibernate将PostGis几何列映射为wkt而不使用nHibernate空间

阎涵容
2023-03-14

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

我看过这个帖子:在NHibernate (fluent)中映射隐藏属性的最佳方式,其中wkt存储在另一列中,他使用触发器来更新实际的几何图形。然而,项目业主不希望为此增加一个额外的栏目。

我也发现了这个主题:在Hibernate中透明地使用PostGIS列,但是没有人给出答案。

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

砰!

共有2个答案

伊光赫
2023-03-14

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

我也调查了nHibernate。空间及其几何类型。但是我不想使用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;   
    }
宫元徽
2023-03-14

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

 类似资料:
  • 本文向大家介绍nhibernate 流利的NHibernate映射,包括了nhibernate 流利的NHibernate映射的使用技巧和注意事项,需要的朋友参考一下 示例 该Fluent NHibernate是一个库,以帮助您在使用C#代码,而不是XML映射的实体映射。Fluent NHibernate使用,fluent pattern并且它基于约定来创建映射,它为Visual Studio工具

  • 问题内容: 我有下表: 我需要将其映射到对象: 在哪里,StronglyTypedData类似于: 默认情况下,XML列映射到XmlDocument属性,但是我希望XML序列化/反序列化到StronglyTypedData属性发生在映射时。 我需要怎么做才能做到这一点? 问题答案: 您需要编写一个负责转换的。 您可以从XmlDocType开始,它实际上是从原始XML转换为XmlDocument的那

  • 问题内容: 有没有办法使用NHibernate将枚举持久化到数据库?那有一张代码表和枚举中每个值的名称。 我想保留没有实体的枚举,但仍然具有从所有其他引用实体到枚举的表的外键(枚举的int表示形式)。 问题答案: 你们为什么把这个复杂化呢?真的很简单。 映射如下所示: 该模型属性如下所示: 枚举看起来像这样: NHibernate将自动解决所有问题。为什么键入比您需要的更多???

  • hibernate 5.1 spatial的文档尚未发布(AFAIK),我正在尝试将带有JST几何字段的实体持久化到PostgreSQL 9.5 Postgis 2.2,但没有任何运气。 我也注意到没有组织。冬眠hibernate-core-5.1中的空间包。0.我尝试了以下注释的变体: 当列定义设置为“点”时,我得到“列”the_geom“是点的类型,但表达式是由茶的类型”。在Hibernate

  • 问题内容: 如何使用NHibernate进行此查询 我正在使用NHibernate3。 我尝试使用新的Linq提供程序来完成此操作,但未成功。只要它产生上面确切的sql查询,我就不在乎它的执行方式。我希望编写一个强类型查询,如果可能的话,不要使用魔术字符串。 我是NHibernate的新手,所以这个问题可能很简单。 这是更多信息 我将Fluent NHibernate与AutoMappings结合

  • 问题内容: 我在获取nHibernate.Search来创建索引时遇到了麻烦。 如果我使用nHibernate.dll和nHibernate.Search.dll的1.2.1.4,则可以正确创建索引,并且可以使用Luke(Lucene实用程序)对其进行检查。创建了一个segments文件以及一个Fragments文件等 但是,当我使用nHibernate.dll和nHibernate.Search