Commit 8ab859c7 authored by Marc Gravell's avatar Marc Gravell

Use binary conversions for SqlGeography/SqlGeometry (thanks to Serge Belov for the hint)

parent 8d967368
......@@ -3,6 +3,7 @@
using System.Data;
using System.Data.Entity.Spatial;
using System.Data.SqlClient;
using System.Data.SqlTypes;
namespace Dapper.EntityFramework
{
......@@ -26,7 +27,12 @@ public class DbGeographyHandler : Dapper.SqlMapper.TypeHandler<DbGeography>
/// <param name="value">Parameter value</param>
public override void SetValue(IDbDataParameter parameter, DbGeography value)
{
parameter.Value = value == null ? (object)DBNull.Value : (object)SqlGeography.Parse(value.AsText());
object parsed = null;
if (value != null)
{
parsed = SqlGeography.STGeomFromWKB(new SqlBytes(value.AsBinary()), value.CoordinateSystemId);
}
parameter.Value = parsed ?? DBNull.Value;
if (parameter is SqlParameter)
{
((SqlParameter)parameter).UdtTypeName = "geography";
......@@ -39,7 +45,13 @@ public override void SetValue(IDbDataParameter parameter, DbGeography value)
/// <returns>The typed value</returns>
public override DbGeography Parse(object value)
{
return (value == null || value is DBNull) ? null : DbGeography.FromText(value.ToString());
if (value == null || value is DBNull) return null;
if (value is SqlGeography)
{
var geo = (SqlGeography)value;
return DbGeography.FromBinary(geo.STAsBinary().Value);
}
return DbGeography.FromText(value.ToString());
}
}
}
......@@ -3,6 +3,7 @@
using System.Data;
using System.Data.Entity.Spatial;
using System.Data.SqlClient;
using System.Data.SqlTypes;
namespace Dapper.EntityFramework
{
......@@ -26,7 +27,12 @@ public class DbGeometryHandler : Dapper.SqlMapper.TypeHandler<DbGeometry>
/// <param name="value">Parameter value</param>
public override void SetValue(IDbDataParameter parameter, DbGeometry value)
{
parameter.Value = value == null ? (object)DBNull.Value : (object)SqlGeometry.Parse(value.AsText());
object parsed = null;
if (value != null)
{
parsed = SqlGeometry.STGeomFromWKB(new SqlBytes(value.AsBinary()), value.CoordinateSystemId);
}
parameter.Value = parsed ?? DBNull.Value;
if (parameter is SqlParameter)
{
((SqlParameter)parameter).UdtTypeName = "geometry";
......@@ -39,7 +45,13 @@ public override void SetValue(IDbDataParameter parameter, DbGeometry value)
/// <returns>The typed value</returns>
public override DbGeometry Parse(object value)
{
return (value == null || value is DBNull) ? null : DbGeometry.FromText(value.ToString());
if (value == null || value is DBNull) return null;
if (value is SqlGeometry)
{
var geo = (SqlGeometry)value;
return DbGeometry.FromBinary(geo.STAsBinary().Value);
}
return DbGeometry.FromText(value.ToString());
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment