gpt4 book ai didi

c# - Fluent NHibernate automap PostGIS 几何类型

转载 作者:行者123 更新时间:2023-11-30 18:25:34 25 4
gpt4 key购买 nike

给定以下模型:

using NetTopologySuite.Geometries;

public class bounding_box
{
public virtual int id { get; protected set; }
public virtual Polygon area { get; set; }
}

在使用 Fluent Nhibernate 生成数据库模式时,如何将 area 属性自动映射到 area geometry(Polygon) 列?请注意,我不关心能否使用 NHibernate 读取/更新几何列,因为我将在我的代码中使用 GDAL。

我知道我可以通过实现手动覆盖来做到这一点,即:

public class bounding_boxMappingOverrride : IAutoMappingOverride<bounding_box>
{
public void Override(AutoMapping<bounding_box> mapping)
{
mapping.Map(x => x.area)
.CustomSqlType("geometry(Polygon)");
}
}

但是,我有很多包含几何列的表,因此我更希望能够指定自定义类型映射。

出于某种原因, area 属性永远不会被以下属性约定拦截:

public class PostgisTypesConvention : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
if (instance.Type == typeof(Polygon))
{
instance.CustomSqlType("geometry(Polygon)"); // Never reached
}
}
}

如果我使用 GeoAPI.Geometries.IPolygon 而不是 NetTopologySuite.Geometries.Polygon,我会遇到同样的问题...

最佳答案

我终于能够通过定义自定义 UserTypeConvention 来解决这个问题,即:

using NetTopologySuite.Geometries;
using NHibernate.Spatial.Type;

public class PostGisPolygonUserTypeConvention : UserTypeConvention<PostGisGeometryType>
{
public override void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
{
criteria.Expect(c => c.Type == typeof(Polygon));
}

public override void Apply(IPropertyInstance instance)
{
// Have to set CustomType to be able to read/write rows using NHibernate
instance.CustomType<PostGisGeometryType>();
// Have to set CustomSqlType to generate correct SQL schema
instance.CustomSqlType("geometry(Polygon)");
}
}

同样的原理也可以用来为其他几何创建UserTypeConventions,比如Point, LineString, MultiPoint

关于c# - Fluent NHibernate automap PostGIS 几何类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29939528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com