在Azure上找不到'Microsoft.SqlServer.Types'版本10或更高版本


98

我正在尝试在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或更高版本。

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

谢谢!


2
您是否正在使用Azure网站或Cloud Services中的Web角色?另外,您的数据库是SQL Azure数据库吗?您是否尝试过对SQL Azure数据库运行本地代码,这行得通吗?
乔·卡普卡

Answers:


131

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

PM>安装包Microsoft.SqlServer.Types

链接以获取更多信息


4
谢谢。在我凌晨2点发表后,这才刚发生在我身上。
李·史密斯

3
很高兴我把那个小礼物装好了!它也总是让我受益。
Pure.Krome,

我的天啊!它仅使用DbGeography就向Web应用程序添加了将近2MB的二进制数据(不,谢谢),并且在SQL Server中使用它时CPU上的负担也很大……将其取出。
Yovav

13
@Yovav,至少您运行在软盘上,我认为2 MB的二进制数据不会对应用程序的性能产生任何影响。我建议您运行一个基准测试,并通过真实数据告知我们对CPU的影响。
DiomedesDomínguez'9

3
这还不足以解决问题,我也必须回答克里斯
Shimmy Weitzhandler '17

114

回答当集的版本11(SQL Server 2012中)可用于上述工程的罚款。

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

要解决此问题,我发现您可以像这样告诉Entity Framework您要使用哪个程序集:

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

2
很棒的地方-也适用于仅安装SQL 2014 CLR类型的计算机。在我们的案例中,我们仅安装了SQL 2012 CLR类型,即可解决此问题。但是,如果您对程序集的较高版本有特定的依赖性,那么这似乎是最好的解决方案。
Andras Zoltan

1
这是静态的公共财产。它应该在应用程序启动时设置。例如,我在Web应用程序的Global.asax.cs的Application_Start事件中进行设置。
克里斯(Chris

3
+1这是唯一对我有用的东西。我将其放在自定义EntityContext类的构造函数中(该继承自off DbContext)。
克里斯(Chris)

2
救了我的培根!
马特·卡什

23
为了避免对程序集名称进行硬编码,可以使用SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack

68

由于某种原因,我缺少绑定重定向,该重定向为我解决了此问题。

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

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

2
为了找出版本号为您的机器上的Microsoft.SqlServer.Types的东西,你可以使用AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }其中_logger是NLOG记录仪
丹尼尔TULP

1
这解决了我的问题(因为在我的情况下已经安装了类型)。如果在安装SQL Server类型后仍然有人出现此错误,请检查此答案。
CanPoyrazoğlu17年

1
@ R2D2谢谢,这也为我修复了它。
Ogglas

1
我安装了SQLServerTypes,仍然遇到问题。将其添加到web.config中对我来说已修复。
saurabhj

25

有两种解决方法:

  1. 如果您具有服务器访问权限,则只需从https://www.microsoft.com/en-us/download/details.aspx?id=29065安装“ SQL Server 2012的Microsoft系统CLR类型”, 或在“直接链接”下方使用“直接链接”到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);

2
安装SQL Server或NuGet并不能解决任何问题,那些简单的CLR类型解决了该问题。这应该是公认的解决方案。
CanPoyrazoğlu17年

1
在Microsoft SQL Server 2016(SP1)(KB3182545)-13.0.4001.0(X64)2016年10月28日18:17:30上,适用于X64的链接适用于我(c)Windows 10 Enterprise上的Microsoft Corporation Express Edition(64位) 6.3 <X64>(内部版本
10586 :)

我需要使用ASP.NET样式加载器,但是我的开发路径~/不是~/bin。一定还要检查您的路径。
jocull

我能够为我想要的SQL版本安装SQL Server Pack,但我绝对必须确保绑定重定向指向所安装的版本,因为每个SQL Server版本的绑定重定向都不同。
克里斯·赖斯

13

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

为我解决了问题的方法是转到解决方案>引用> System.Data.Entity>属性>复制本地,并将其设置为True。

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

该解决方案来自Windows Azure论坛


1
此选项不适用于nuget软件包。
Shimmy Weitzhandler '17

如前所述,这是因为它在引用的属性选项中,而不是在nuget的选项中:)感谢您的解决方法!为我工作
Emixam23'9

9

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

这对我有用


5

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

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

兄弟们,祝你好运。


3

在对当前帖子的答案中发表评论后,添加以下两行(最好是主功能)解决了控制台应用程序的问题:

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

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

希望对您有所帮助。


1
这适用于VS 2019环境,最新修复。感谢您的分享
编码器kemp

1

上述解决方案均无法解决我的问题。

  • 安装了SQL Server Feature Pack?是
  • 是否安装了NuGet软件包?是
  • DLL是否存在于GAC和项目bin中?是

您知道吗,此错误也可能是由于服务器上的资源不足所致。我重新启动了SQL Server,它已自动解决。


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一切正常。


0

在我的情况下,造成此问题的原因是连接字符串组成不正确。验证您的连接字符串是否正确组成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.