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 @@ ...@@ -3,6 +3,7 @@
using System.Data; using System.Data;
using System.Data.Entity.Spatial; using System.Data.Entity.Spatial;
using System.Data.SqlClient; using System.Data.SqlClient;
using System.Data.SqlTypes;
namespace Dapper.EntityFramework namespace Dapper.EntityFramework
{ {
...@@ -26,7 +27,12 @@ public class DbGeographyHandler : Dapper.SqlMapper.TypeHandler<DbGeography> ...@@ -26,7 +27,12 @@ public class DbGeographyHandler : Dapper.SqlMapper.TypeHandler<DbGeography>
/// <param name="value">Parameter value</param> /// <param name="value">Parameter value</param>
public override void SetValue(IDbDataParameter parameter, DbGeography value) 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) if (parameter is SqlParameter)
{ {
((SqlParameter)parameter).UdtTypeName = "geography"; ((SqlParameter)parameter).UdtTypeName = "geography";
...@@ -39,7 +45,13 @@ public override void SetValue(IDbDataParameter parameter, DbGeography value) ...@@ -39,7 +45,13 @@ public override void SetValue(IDbDataParameter parameter, DbGeography value)
/// <returns>The typed value</returns> /// <returns>The typed value</returns>
public override DbGeography Parse(object value) 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 @@ ...@@ -3,6 +3,7 @@
using System.Data; using System.Data;
using System.Data.Entity.Spatial; using System.Data.Entity.Spatial;
using System.Data.SqlClient; using System.Data.SqlClient;
using System.Data.SqlTypes;
namespace Dapper.EntityFramework namespace Dapper.EntityFramework
{ {
...@@ -26,7 +27,12 @@ public class DbGeometryHandler : Dapper.SqlMapper.TypeHandler<DbGeometry> ...@@ -26,7 +27,12 @@ public class DbGeometryHandler : Dapper.SqlMapper.TypeHandler<DbGeometry>
/// <param name="value">Parameter value</param> /// <param name="value">Parameter value</param>
public override void SetValue(IDbDataParameter parameter, DbGeometry value) 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) if (parameter is SqlParameter)
{ {
((SqlParameter)parameter).UdtTypeName = "geometry"; ((SqlParameter)parameter).UdtTypeName = "geometry";
...@@ -39,7 +45,13 @@ public override void SetValue(IDbDataParameter parameter, DbGeometry value) ...@@ -39,7 +45,13 @@ public override void SetValue(IDbDataParameter parameter, DbGeometry value)
/// <returns>The typed value</returns> /// <returns>The typed value</returns>
public override DbGeometry Parse(object value) 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