【问题标题】:Is it possible to use Geography data type of SQL Server 2017 in ASP.NET application using .NET 4.8?是否可以在使用 .NET 4.8 的 ASP.NET 应用程序中使用 SQL Server 2017 的地理数据类型?
【发布时间】:2020-04-15 13:04:29
【问题描述】:

我无法在 ASP.NET 应用程序的 SQL Server 2017 中配置为使用具有 Geography 数据类型的数据库。

在我的另一个问题中,我概述了各种不起作用的解决方法。 链接:SO Question

任何人都可以在 ASP.NET 应用程序中使用 SQL Server 2017 中的 Geography 类型成功确认。如果是,是什么配置?

唯一的解决方法是将geography 数据转换为字符串,然后在客户端对其进行反序列化,这是一种可怕的做事方式...

【问题讨论】:

    标签: asp.net .net sql-server datareader


    【解决方案1】:

    我在一个解决方案中使用了 OData v4 API,该解决方案允许农民绘制他们的农场和围场地图,并且他们可以在这些地图上放置大门。

    在您的模型中,使用System.Data.Entity.Spatial.DbGeography 作为您希望在 SQL 中成为Geography的字段的数据类型

    在我们的解决方案中,围场作为 POLYGONMULTIPOLYGON 存储在 DbGeography 字段中,门作为 POINT 存储在 DbGeography 字段中>。我们可以查询边界框中的所有围场,计算面积和距离...几乎所有客户可以向我们提出的地理空间查询...

    值得注意的当前软件包(但相同软件包的先前版本已在去年运行):

    • 实体框架 6.4.0
    • Microsoft.AspNet.OData 7.3.0
    • Microsoft.AspNet.WebApi 5.2.7
    • Microsoft.Spatial 7.6.2
    • Microsoft.SqlServer.Types 14.0.1016.290
    • Newtonsoft.Json 12.0.1

    如果您需要与 GeoJSON 源交互,无论是导入还是导出,我也使用这些包,但您应该能够在没有它们的情况下编写包含的应用程序:

    • GeoJSON.Net 1.1.72
    • GeoJSON.Net.Contrib.EntityFramework 0.1.3
    • GeoJSON.Net.Contrib.MsSqlSpatial 0.3.2
    • GeoJSON.Net.Contrib.Wkb 0.1.3

    OData 序列化程序没有对这些类型的序列化或反序列化造成任何问题,对其中一个边界的查询会返回:

    {
        "@odata.context": ".../$metadata#Paddocks(17518)/Perimeter",
        "Geography": {
            "CoordinateSystemId": 4326,
            "WellKnownText": "POLYGON ((145.27786016464236 -37.855119294600946, 145.27687250851116 -37.855329119608058, 145.276149480753 -37.855902375057504, 145.27588481613736 -37.856685463693672, 145.2761494445584 -37.857468560509645, 145.27687247231654 -37.85804183231879, 145.27786016464236 -37.858251665505662, 145.27884785696818 -37.85804183231879, 145.27957088472633 -37.857468560509659, 145.27983551314736 -37.856685463693672, 145.27957084853173 -37.855902375057504, 145.27884782077356 -37.855329119608058, 145.27786016464236 -37.855119294600946))"
        }
    }
    

    如果您在客户端使用地理数据类型时遇到问题,您会发现它只是语法,因此可以克服,但您需要发布您遇到的更具体的问题,您可能会发现更多如果您在客户端使用 GeoJSON,则工具和通用支持,像 leaflet js 这样的映射组件本机使用 GeoJSON,因此如果您从头开始使用映射解决方案,您可能会发现直接使用 GeoJSON 更容易整合。

    在我的另一个问题中,我概述了各种不起作用的解决方法

    由于您没有包含任何指向您之前问题的链接,我不确定您之前的相关问题是什么,但我希望这能让您有信心坚持使用您的解决方案。


    更新

    而不是遵循关于SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));的建议

    我在部署期间手动将类型 dll 的 x86 版本复制到 bin 文件夹中(因为服务器运行 IIS 32 位。如果您的服务器运行在 64 位模式下,请使用 x64 版本)

    我还在 web.config 中添加了这个绑定重定向:

    <assemblyBinding>
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.SqlServer.Types" 
                              publicKeyToken="89845dcd8080cc91" culture="neutral" />
            <bindingRedirect oldVersion="10.0.0.0" newVersion="14.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
    

    连接字符串或其他任何东西都没有什么特别之处。

    【讨论】:

    • 谢谢。我使用与您相同版本的 Microsoft.SqlServer.Types 和相同的实体框架。但问题不在于实体框架,因为即使是普通的旧 Datareader 也会导致异常。顺便提一句。我已经更新了带有引用问题链接的问题。如果不是太麻烦,您可以显示您的连接字符串和网络配置的相关部分吗?
    • 好的,如果可以的话,我会在那边帮助你,我已经用我忘记的其他一些元素更新了我的答案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多