using Microsoft.SqlServer.Types; using System; using System.Data; using System.Data.Entity.Spatial; using System.Data.SqlClient; using System.Data.SqlTypes; namespace Dapper.EntityFramework { /// /// Type-handler for the DbGeometry spatial type. /// public class DbGeometryHandler : SqlMapper.TypeHandler { /// /// Create a new handler instance. /// protected DbGeometryHandler() { /* create new */ } /// /// Default handler instance. /// public static readonly DbGeometryHandler Default = new DbGeometryHandler(); /// /// Assign the value of a parameter before a command executes. /// /// The parameter to configure. /// Parameter value. public override void SetValue(IDbDataParameter parameter, DbGeometry? value) { object? parsed = null; if (value is not null) { parsed = SqlGeometry.STGeomFromWKB(new SqlBytes(value.AsBinary()), value.CoordinateSystemId); } parameter.Value = parsed ?? DBNull.Value; if (parameter is SqlParameter sqlP) { sqlP.UdtTypeName = "geometry"; } } /// /// Parse a database value back to a typed value. /// /// The value from the database. /// The typed value. public override DbGeometry? Parse(object? value) { if (value is null || value is DBNull) return null; if (value is SqlGeometry geo) { return DbGeometry.FromBinary(geo.STAsBinary().Value, geo.STSrid.Value); } return DbGeometry.FromText(value.ToString()); } } }