106

我正在尝试在 ASP.NET MVC 4 中创建一个 webapi。webapi 使用了 Entity Framework 5 Spatial 类型,我编写了一个非常简单的代码。

  public List<Area> GetAllAreas()
    {
        List<Area> aList = db.Areas.ToList();
        return aList;
    }

区域包含 DbGeometry。

当我在本地运行它时它可以工作,但是当我将它发布到天蓝色时它给了我这个错误:

空间类型和函数不适用于此提供程序,因为找不到程序集“Microsoft.SqlServer.Types”版本 10 或更高版本。

有谁知道如何解决这个问题?:)

谢谢!

4

12 回答 12

136

我找到了解决方案!只需安装 nuget 包 Microsoft.SqlServer.Types

PM> Install-Package Microsoft.SqlServer.Types

链接了解更多信息

于 2012-11-01T10:23:05.950 回答
120

当可以使用程序集的版本 11 (SQL Server 2012) 时,上面的答案可以正常工作。

我对此有疑问,因为我的解决方案对同一程序集的版本 13 (SQL Server 2016) 有其他依赖项。在这种情况下,请注意实体框架(至少 v6.1.3)在其SqlTypesAssemblyLoader(此异常的来源)中进行了硬编码,以仅查找程序集的版本 10 和 11。

为了解决这个问题,我发现你可以告诉 Entity Framework 你想使用哪个程序集,如下所示:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
于 2016-10-20T23:40:04.670 回答
76

出于某种原因,我错过了一个绑定重定向,它为我解决了这个问题。

添加以下内容解决了我的问题

    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
      <bindingRedirect oldVersion="10.0.0.0-11.0.0.0" newVersion="14.0.0.0" />
    </dependentAssembly>
于 2017-06-29T08:27:04.310 回答
26

有两种方法可以解决这个问题:

  1. 如果您有服务器访问权限,只需安装“Microsoft System CLR Types for SQL Server 2012”,它来自https://www.microsoft.com/en-us/download/details.aspx?id=29065 或使用直接链接下方的直接链接到 X86: http: //go.microsoft.com/fwlink/ ?LinkID=239643&clcid=0x409,或直接链接到 X64: http: //go.microsoft.com/fwlink/ ?LinkID=239644&clcid=0x409
  2. 第二种方法是使用 NuGet 包管理器并安装

    安装包 Microsoft.SqlServer.Types

然后按照插件说明如下

要将使用空间数据类型的应用程序部署到未安装“SQL Server 的系统 CLR 类型”的计算机,您还需要部署本机程序集 SqlServerSpatial110.dll。此程序集的 x86(32 位)和 x64(64 位)版本都已添加到项目的 SqlServerTypes\x86 和 SqlServerTypes\x64 子目录下。如果未安装 C++ 运行时,还包括本机程序集 msvcr100.dll。

您需要添加代码以在运行时加载正确的这些程序集之一(取决于当前架构)。

ASP.NET 应用程序 对于 ASP.NET 应用程序,将以下代码行添加到 Global.asax.cs 中的 Application_Start 方法:

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

桌面应用程序 对于桌面应用程序,添加以下代码行以在执行任何空间操作之前运行:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
于 2017-01-31T13:43:41.437 回答
17

请在 Web.config 文件中添加“dependentAssembly”

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

这对我有用

于 2018-08-16T14:09:29.410 回答
13

我也遇到了这个问题,但是已经安装了Microsoft.SqlServer.Types nuget包。

为我解决问题的是解决方案 > 参考 > System.Data.Entity > 属性 > 复制本地,并将其设置为 True。

注意: Microsoft.SqlServer.Types 的 Copy Local 已设置为 true,即使问题出在 System.Data.Entity 上,错误消息仍然与 Microsoft.SqlServer.Types 有关。

该解决方案来自Windows Azure 论坛

于 2013-01-08T19:25:50.360 回答
5

我的解决方案只是将这行代码添加到 Global.asax.cs 中Application_Start()

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

祝我的兄弟们好运。

于 2016-08-26T12:15:46.477 回答
3

在当前帖子的答案中发表评论后,添加这两行(最好是 main 函数)解决了我对控制台应用程序的问题:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
于 2018-10-31T16:25:06.313 回答
3

在我的情况下(一个 WebForms 应用程序),我解决了Application_StartGlobal.asax文件中添加以下行的问题。

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
System.Data.Entity.SqlServer.SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

我希望它可以帮助某人。

于 2019-09-12T17:36:17.030 回答
1

以上解决方案都没有对我有用。

  • 安装了 SQL Server 功能包?是的
  • 安装了 NuGet 包?是的
  • DLL 存在于 GAC 和项目 bin 中吗?是的

你知道吗,这个错误也可能是由于服务器上的资源不足。我重新启动了 SQL Server,它自动得到了解决。

于 2016-10-20T11:14:01.090 回答
0

在我的情况下,一个糟糕的连接字符串导致了这种情况。验证您的连接字符串是否正确组合。

于 2017-03-18T07:11:54.703 回答
0

只是有同样的问题。我正在使用EF6和调用SQL它,它有一个使用空间命令的 SQL 函数。我通过单元测试对此进行了测试,并且效果很好。当我去连接我的Asp.Net解决方案时,我收到了错误

空间类型和函数不适用于此提供程序,因为找不到程序集“Microsoft.SqlServer.Types”版本 10 或更高版本。

通过添加NUGET包“Microsoft.SqlServer.Types”并添加SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));到一切正常Application_Start methodGlobal.asax.cs

于 2017-01-08T15:29:30.653 回答