'Microsoft.SqlServer.Types' versão 10 ou superior não foi encontrado no Azure

98

Estou tentando fazer um webapi na ASP.NET MVC 4. O webapi usou o Entity Framework 5 Spatial types e escrevi um código muito simples.

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

A área contém DbGeometry.

Quando eu executo este local, ele funciona, mas quando eu o publico no azure, ele me mostra este erro:

Tipos e funções espaciais não estão disponíveis para este provedor porque o assembly 'Microsoft.SqlServer.Types' versão 10 ou superior não foi encontrado.

Alguém sabe como resolver isso ? :)

Obrigado!

Thomas Bolander
fonte
2
Você está usando os Sites do Azure ou uma função web nos Serviços de Nuvem? Além disso, seu banco de dados é um banco de dados SQL Azure? Você já tentou executar seu código local no banco de dados SQL Azure e isso funciona?
Joe Capka

Respostas:

131

Encontrei a solução! Basta instalar o pacote nuget Microsoft.SqlServer.Types

PM> Install-Package Microsoft.SqlServer.Types

Link para mais informações

Thomas Bolander
fonte
4
Obrigado. Isso só aconteceu comigo depois que publiquei às 2 da manhã.
Lee Smith
3
Ainda bem que coloquei aquele pacote de pepitas! Sempre me pega também.
Pure.Krome
AMD! ele adiciona quase 2 MB de dados binários ao aplicativo da web apenas para usar DbGeography (não, obrigado) também é pesado na CPU ao usá-lo no SQL Server ... tirando-o.
Yovav
13
@Yovav, pelo menos você está rodando em um disquete, não acho que 2 MB de dados binários tenham qualquer influência no desempenho de sua aplicação. Eu sugiro que você faça um benchmark e nos informe (com dados reais) o impacto na CPU.
Diomedes Domínguez
3
Isso não foi o suficiente para resolver o problema, eu tive que fazer a resposta de Chris também.
Shimmy Weitzhandler
114

A resposta acima funciona bem quando a versão 11 (SQL Server 2012) do assembly pode ser usada.

Tive um problema com isso porque minha solução tem outras dependências na versão 13 (SQL Server 2016) do mesmo assembly. Nesse caso, observe que o Entity Framework (pelo menos v6.1.3) está codificado em seu SqlTypesAssemblyLoader (a fonte dessa exceção) para procurar apenas as versões 10 e 11 do assembly.

Para contornar isso, descobri que você pode dizer ao Entity Framework qual assembly deseja usar assim:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Chris
fonte
2
Excelente local - também se aplica a máquinas onde apenas os tipos SQL 2014 CLR estão instalados. No nosso caso, acabamos de instalar o SQL 2012 CLR Types e ele corrigiu o problema; mas se você tiver uma dependência específica das versões superiores dos assemblies, essa parece ser a melhor solução.
Andras Zoltan,
1
É uma propriedade pública estática. Deve ser definido na inicialização do aplicativo. Por exemplo, estou configurando no evento Application_Start no Global.asax.cs do meu aplicativo da web.
Chris
3
+1 Esta é a única coisa que funcionou para mim. Eu coloquei no construtor da minha EntityContextclasse personalizada (que herda fora DbContext).
Chris
2
Salvei meu bacon!
Matt Cashatt
23
Para evitar a codificação do nome do assembly, você pode usarSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack
68

Por algum motivo, estava faltando um redirecionamento de ligação que corrigiu esse problema para mim.

Adicionar o seguinte corrigiu meu problema

    <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>
Lord Darth Vader
fonte
2
Para descobrir qual é o número da versão do Microsoft.SqlServer.Types em sua máquina, você pode usar AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }onde _logger é um registrador de Nlog
Daniël Tulp
1
Isso resolveu meu problema (como tipos já estava instalado no meu caso). Se alguém ainda receber a mensagem de erro após instalar os Tipos do SQL Server, verifique esta resposta.
Can Poyrazoğlu
1
@ R2D2 Obrigado, isso corrigiu para mim também.
Ogglas
1
Eu instalei SQLServerTypes e ainda estava enfrentando um problema. Adicionar isso ao web.config corrigiu para mim.
saurabhj
25

Existem 2 maneiras de corrigir isso:

  1. Se você tiver acesso ao servidor, basta instalar “Tipos de CLR do Microsoft System para SQL Server 2012” em https://www.microsoft.com/en-us/download/details.aspx?id=29065 Ou usar link direto abaixo do link direto para X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 , Ou Direct Link para X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. A segunda maneira é usar o gerenciador de pacotes NuGet e instalar

    Install-Package Microsoft.SqlServer.Types

Em seguida, siga as notas do plugin como abaixo

Para implantar um aplicativo que usa tipos de dados espaciais em uma máquina que não tem 'Tipos de CLR do sistema para SQL Server' instalado, você também precisa implantar o assembly nativo SqlServerSpatial110.dll. As versões x86 (32 bits) e x64 (64 bits) deste assembly foram adicionadas ao seu projeto nos subdiretórios SqlServerTypes \ x86 e SqlServerTypes \ x64. O assembly nativo msvcr100.dll também está incluído, caso o tempo de execução C ++ não esteja instalado.

Você precisa adicionar código para carregar o correto desses assemblies em tempo de execução (dependendo da arquitetura atual).

Aplicativos ASP.NET Para aplicativos ASP.NET, adicione a seguinte linha de código ao método Application_Start em Global.asax.cs:

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

Aplicativos de desktop Para aplicativos de desktop, adicione a seguinte linha de código para executar antes de qualquer operação espacial:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Tarek El-Mallah
fonte
2
Instalar o SQL Server ou NuGet não resolveu nada, aqueles tipos simples de CLR resolveram o problema. Esta deve ser a solução aceita.
Can Poyrazoğlu
1
O link para X64 funcionou para mim no Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 de outubro de 2016 18:17:30 Copyright (c) Microsoft Corporation Express Edition (64 bits) no Windows 10 Enterprise 6.3 <X64> (Build 10586
:)
Eu precisava usar o carregador de estilo ASP.NET, mas meu caminho de desenvolvimento foi em ~/vez de ~/bin. Certifique-se de verificar seu caminho também.
jocull
Consegui instalar o pacote do servidor SQL para a versão do SQL que queria, mas tive que garantir que o redirecionamento de ligação foi apontado para a versão instalada, pois eles são diferentes para cada versão do servidor SQL.
Chris Rice,
13

Eu também encontrei esse problema, mas o pacote nuget Microsoft.SqlServer.Types já estava instalado.

O que resolveu o problema para mim foi ir para Solução> Referências> System.Data.Entity> Propriedades> Copiar local e defini-lo como True.

Observação: Copiar local para Microsoft.SqlServer.Types já estava definido como verdadeiro e, embora o problema fosse com System.Data.Entity, a mensagem de erro ainda era sobre Microsoft.SqlServer.Types.

A solução vem do fórum do Windows Azure .

Lumière Inusável
fonte
1
Esta opção não está disponível em pacotes nuget.
Shimmy Weitzhandler
É porque, como mencionado, está nas opções de propriedades da referência, não nas opções do nuget :) Obrigado pela sua solução alternativa! Trabalhou para mim
Emixam23,
8

Adicione "dependenteAssembly" ao arquivo Web.config

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

Isso funcionou para mim

Ertuğrul Üngör
fonte
5

A solução para mim foi apenas adicionar esta linha de código a Global.asax.cs em Application_Start():

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

Boa sorte meus irmãos.

devKoen1
fonte
3

Seguindo um comentário em uma resposta para a postagem atual, adicionar essas duas linhas (de preferência à função principal) resolveu meu problema para o aplicativo de console:

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

No meu caso (um aplicativo WebForms) resolvi o problema adicionando as seguintes linhas no Application_Startdo Global.asaxarquivo.

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

Eu espero que isso ajude alguém.

Dr. TJ
fonte
isso funcionou para o ambiente VS 2019, última correção. obrigado por compartilhar
coder kemp
1

Nenhuma das soluções acima me funcionou.

  • Pacote de recursos do SQL Server instalado? sim
  • Pacote NuGet instalado? sim
  • O DLL existe no GAC e no escaninho do projeto? sim

Você sabe o quê, esse erro também pode ser devido a poucos recursos no servidor . Reiniciei o servidor SQL e ele foi resolvido automaticamente.

MPM
fonte
0

Só tive o mesmo problema. Estou usando EF6e chamando o SQLque tem uma função SQL que usa comandos espaciais. Eu testei isso por meio de um teste de unidade e funcionou bem. Quando fui conectar minha Asp.Netsolução, recebi o erro

Tipos e funções espaciais não estão disponíveis para este provedor porque o assembly 'Microsoft.SqlServer.Types' versão 10 ou superior não foi encontrado.

Ao adicionar os NUGET"Microsoft.SqlServer.Types" pacote e adicionando SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));ao Application_Start methodem Global.asax.cstudo funcionou bem.

Bayer White
fonte
0

No meu caso, uma string de conexão mal composta causou isso. Verifique se sua string de conexão está composta corretamente.

Raghu Reddy Muttana
fonte