使用带有IGeometry的SqlServer Geometry类型

时间:2014-05-28 13:04:31

标签: c# sql-server nhibernate

我们有一个Fluent Nhibernate模型,它将连接到MS Sql Server 2008数据库,我们一直在针对SQLite测试数据库运行单元测试。

我们正在使用GeoAPI.Geometries来允许我们在班级中拥有IGeometry成员。 当针对SQLite内存测试数据库运行时,它通过我们作为约定添加到我们流畅的配置中的转换。:

public class SQLiteGeometryTypeConvention : IPropertyConvention
    {
        public void Apply(IPropertyInstance instance)
        {
            if (instance.Property.PropertyType.Equals(typeof(IGeometry)))
            {
                instance.CustomType(typeof(SQLiteGeometryType));
            }
        }
    }

这是使用我们针对GeometryTypeBase(NHibernate.Spatial.Type)创建的类型,它适用于我们的测试。

当针对SqlServer运行时,我们正在尝试对抗NHibernate.Spatial.Type.MsSql2008GeometryType:

public void Apply(IPropertyInstance instance)
        {
            if (instance.Property.PropertyType.Equals(typeof(IGeometry)))
            {
                instance.CustomType(typeof(MsSql2008GeometryType));
            }
        }

但这导致属性返回为null。

有关我应该做什么的任何建议?是否不可能针对IGeometry投射该类型?

1 个答案:

答案 0 :(得分:0)

blog post我最初得到Sqlite代码之后,我实际上使用了相同的代码 Sql Server类型的代码。

我将SQL Server位重写为:

public class MsSqlGeometryConversion : IPropertyConvention
    {
        public void Apply(IPropertyInstance instance)
        {
            if (instance.Property.PropertyType.Equals(typeof(IGeometry)))
            {
                instance.CustomType(typeof(MsSqlGeometryHandler));
            }
        }
    }

    public class MsSqlGeometryHandler : GeometryTypeBase<string>
    {
        public MsSqlGeometryHandler()
            : base(NHibernateUtil.String)
        {
        }

        protected override string FromGeometry(object value)
        {
            return value != null ? ((IGeometry)value).AsText() : null;
        }

        protected override IGeometry ToGeometry(object value)
        {
            return value != null ? new WKTReader().Read((string)value) : null;
        }
    }

这似乎工作正常。