【问题标题】:'Microsoft.SqlServer.Types' version 10 or higher could not be found on Azure在 Azure 上找不到“Microsoft.SqlServer.Types”版本 10 或更高版本
【发布时间】:2012-11-01 09:28:37
【问题描述】:

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

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

Area 包含 DbGeometry。

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

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

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

谢谢!

【问题讨论】:

  • 您使用的是 Azure 网站还是云服务中的 Web 角色?另外,您的数据库是 SQL Azure 数据库吗?您是否尝试过针对 SQL Azure 数据库运行本地代码,是否可行?

标签: asp.net-mvc entity-framework azure


【解决方案1】:

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

PM> 安装包 Microsoft.SqlServer.Types

Link for more info

【讨论】:

  • 谢谢。这只是在我凌晨 2 点发布后发生在我身上。
  • 很高兴我把那个 nuget 包放了起来!它也总是让我着迷。
  • 天哪!它向 Web 应用程序添加了近 2MB 的二进制数据,只是为了使用 DbGeography(不,谢谢)在 SQL Server 中使用它时 CPU 也很重......把它拿出来。
  • @Yovav,至少你在软盘上运行我不认为 2 MB 的二进制数据对你的应用程序的性能有任何影响。我建议您运行一个基准测试并让我们知道(使用真实数据)对 CPU 的影响。
  • 这还不足以解决问题,我还必须这样做Chris' answer
【解决方案2】:

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

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

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

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;

【讨论】:

  • 好地方 - 也适用于仅安装 SQL 2014 CLR 类型的机器。在我们的例子中,我们刚刚安装了 SQL 2012 CLR Types,它解决了这个问题;但是如果您对更高版本的程序集有特定的依赖关系,那么这似乎是最好的解决方案。
  • 这是一个静态公共属性。它应该在应用程序启动时设置。例如。我在我的 Web 应用程序的 Global.asax.cs 中的 Application_Start 事件中设置它。
  • +1 这是唯一对我有用的东西。我把它放在我的自定义 EntityContext 类的构造函数中(继承 DbContext)。
  • 救了我的培根!
  • 为避免对程序集名称进行硬编码,您可以使用SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
【解决方案3】:

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

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

    <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>

【讨论】:

  • 为了找出你机器上Microsoft.SqlServer.Types的版本号,你可以使用AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); },其中_logger是一个Nlog logger
  • 这解决了我的问题(因为我的案例中已经安装了类型)。如果有人在安装 SQL Server Types 后仍然收到错误,请检查此答案。
  • @R2D2 谢谢,这也为我解决了问题。
  • 我安装了 SQLServerTypes,但仍然遇到问题。将此添加到 web.config 为我修复了它。
【解决方案4】:

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

  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 子目录。本机程序集 msvcr100.dll 是 还包括在未安装 C++ 运行时的情况下。

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

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

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

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

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

【讨论】:

  • 安装 SQL Server 或 NuGet 并没有解决任何问题,那些简单的 CLR 类型解决了问题。这应该是公认的解决方案。
  • X64 的链接适用于 Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 版权所有 (c) Microsoft Corporation Express Edition ( 64 位)在 Windows 10 Enterprise 6.3 (内部版本 10586:)
  • 我需要使用 ASP.NET 样式加载器,但我的开发路径是 ~/ 而不是 ~/bin。一定要检查你的路径。
  • 我能够为我想要的 SQL 版本安装 SQL 服务器包,但我绝对必须确保绑定重定向指向安装的版本,因为它们对于每个 SQL 服务器都是不同的版本。
【解决方案5】:

请在 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>

这对我有用

【讨论】:

  • 这对我有用。我的包突然停止在我的本地机器上运行,但仍在 azure 上运行。
  • 感谢有用的提示。适合我的问题
【解决方案6】:

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

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

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

解决方案来自Windows Azure forum

【讨论】:

  • 此选项在 nuget 包上不可用。
  • 这是因为,如前所述,它位于参考的属性选项中,而不是 nuget 的选项中 :) 感谢您的解决方法!为我工作
【解决方案7】:

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

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

祝兄弟们好运。

【讨论】:

    【解决方案8】:

    在当前帖子的答案中添加comment 后,添加这两行(最好添加到主函数)解决了我的控制台应用问题:

    SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
    SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
    

    【讨论】:

      【解决方案9】:

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

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

      我希望它对某人有所帮助。

      【讨论】:

      • 这适用于 VS 2019 环境,最新修复。感谢分享
      【解决方案10】:

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

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

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

      【讨论】:

        【解决方案11】:

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

        空间类型和功能不适用于此提供程序 因为程序集 'Microsoft.SqlServer.Types' 版本 10 或更高 找不到。

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

        【讨论】:

          【解决方案12】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-12
            • 1970-01-01
            • 2019-09-04
            • 1970-01-01
            • 2018-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多