如何在EF核心中调用具有空间参数的存储过程

时间:2019-06-06 02:08:00

标签: c# sql-server .net-core entity-framework-core-2.2

我正在使用EF Core 2.2.0,并且试图调用参数类型为Geometry的存储过程。当我调用存储过程时,出现此错误:

  

指定的类型未在目标服务器上注册。 NetTopologySuite.Geometries.Polygon,NetTopologySuite,版本= 1.15.2.0,Culture = neutral,PublicKeyToken = f580a05016ebada1。

我这样调用存储过程:

// Create IGeometry with NetTopologySuite.Features.Feature
IGeometry zone= feature.Geometry;

var zoneParameter = new SqlParameter
{
    ParameterName = "@zone",
    Value = zone,
    SqlDbType = SqlDbType.Udt,
    UdtTypeName = "Geometry"
};

return _context.Query<ReportDTO>()
    .FromSql("mySP {0}", zoneParameter)
    .ToList();

我的存储过程就是这样:

ALTER PROCEDURE mySP  
    @zone GEOMETRY
AS
BEGIN
    -- do something
END

SQL Server版本是:Microsoft SQL Azure(RTM)-12.0.2000.8

这是EF Core上不支持的吗,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

你应该转换几何

var geometryWriter = new SqlServerBytesWriter {IsGeography = false};
var geometryBytes = geometryWriter.Write(zone);

var zoneParameter = new SqlParameter
{
    ParameterName = "@zone",
    Value = geometryBytes,
    SqlDbType = SqlDbType.Udt,
    UdtTypeName = "Geometry"
};

return _context.Query<ReportDTO>()
    .FromSql("mySP {0}", zoneParameter)
    .ToList();