'Microsoft.SqlServer.Types' versión 10 o superior no se pudo encontrar en Azure

98

Estoy tratando de hacer un webapi en ASP.NET MVC 4. El webapi usó Entity Framework 5 tipos espaciales y escribí un código muy simple.

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

El área contiene DbGeometry.

Cuando ejecuto este local, funciona, pero cuando lo publico en azul, me da este error:

Los tipos y funciones espaciales no están disponibles para este proveedor porque no se pudo encontrar el ensamblado 'Microsoft.SqlServer.Types' versión 10 o superior.

Alguien sabe como resolver esto ? :)

¡Gracias!

Thomas Bolander
fuente
2
¿Está utilizando sitios web de Azure o un rol web en los servicios en la nube? Además, ¿su base de datos es una base de datos SQL Azure? ¿Ha intentado ejecutar su código local en la base de datos SQL Azure y funciona?
Joe Capka

Respuestas:

131

¡Encontré la solución! Simplemente instale el paquete nuget Microsoft.SqlServer.Types

PM> Paquete de instalación Microsoft.SqlServer.Types

Enlace para más información

Thomas Bolander
fuente
4
Gracias. Esto me acaba de pasar después de que publiqué a las 2 am.
Lee Smith
3
¡Me alegro de haber puesto ese paquete nuget! Siempre me atrapa a mí también.
Pure.Krome
¡DIOS MIO! agrega casi 2 MB de datos binarios a la aplicación web solo por usar DbGeography (no, gracias) también es pesado en la CPU cuando se usa en SQL Server ... eliminándolo.
Yovav
13
@Yovav, al menos estás ejecutando en un disquete. No creo que 2 MB de datos binarios tengan ninguna influencia en el rendimiento de tu aplicación. Le sugiero que ejecute un banco de pruebas y nos haga saber (con datos reales) el impacto en la CPU.
Diomedes Domínguez
3
Eso no fue suficiente para resolver el problema, también tuve que dar la respuesta de Chris .
Shimmy Weitzhandler
114

La respuesta anterior funciona bien cuando se puede usar la versión 11 (SQL Server 2012) del ensamblado.

Tuve un problema con esto porque mi solución tiene otras dependencias en la versión 13 (SQL Server 2016) del mismo ensamblado. En este caso, tenga en cuenta que Entity Framework (al menos v6.1.3) está codificado en su SqlTypesAssemblyLoader (el origen de esta excepción) para buscar solo las versiones 10 y 11 del ensamblado.

Para solucionar esto, descubrí que puede decirle a Entity Framework qué ensamblado desea usar de esta manera:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Chris
fuente
2
Excelente lugar: también se aplica a máquinas donde solo se instalan los tipos CLR de SQL 2014. En nuestro caso, acabamos de instalar los tipos CLR de SQL 2012 y solucionó el problema; pero si tiene una dependencia específica en las versiones superiores de los ensamblados, esta parece ser la mejor solución.
Andras Zoltan
1
Es una propiedad pública estática. Debe configurarse al iniciar la aplicación. Por ejemplo, lo estoy configurando en el evento Application_Start en Global.asax.cs de mi aplicación web.
Chris
3
+1 Esto es lo único que me ha funcionado. Lo puse en el constructor de mi EntityContextclase personalizada (que hereda DbContext).
Chris
2
¡Salvé mi tocino!
Matt Cashatt
23
Para evitar codificar el nombre del ensamblado, puede usarSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack
68

Por alguna razón, me faltaba un redireccionamiento vinculante que me solucionó este problema.

Agregar lo siguiente solucionó mi 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
fuente
2
Para saber cuál es el número de versión de Microsoft.SqlServer.Types en su máquina, puede usar AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }donde _logger es un registrador Nlog
Daniël Tulp
1
Esto resolvió mi problema (ya que los tipos ya estaban instalados en mi caso). Si alguien aún recibe el error después de instalar los tipos de SQL Server, verifique esta respuesta.
Can Poyrazoğlu
1
@ R2D2 Gracias, esto también lo solucionó para mí.
Ogglas
1
Instalé SQLServerTypes y todavía tenía un problema. Agregar esto al web.config lo solucionó para mí.
saurabhj
25

Hay 2 formas de solucionarlo:

  1. Si tiene acceso al servidor, simplemente instale "Tipos de CLR del sistema de Microsoft para SQL Server 2012", que se encuentra en https://www.microsoft.com/en-us/download/details.aspx?id=29065 o utilice el enlace directo debajo del enlace directo a X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 , o enlace directo a X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. La segunda forma es usar el administrador de paquetes NuGet e instalar

    Paquete de instalación Microsoft.SqlServer.Types

Luego siga las notas del complemento como se muestra a continuación

Para implementar una aplicación que utiliza tipos de datos espaciales en una máquina que no tiene instalado 'Tipos de CLR del sistema para SQL Server', también debe implementar el ensamblado nativo SqlServerSpatial110.dll. Se han agregado a su proyecto las versiones x86 (32 bits) y x64 (64 bits) de este ensamblaje en los subdirectorios SqlServerTypes \ x86 y SqlServerTypes \ x64. El ensamblado nativo msvcr100.dll también se incluye en caso de que el tiempo de ejecución de C ++ no esté instalado.

Debe agregar código para cargar el correcto de estos ensamblados en tiempo de ejecución (según la arquitectura actual).

Aplicaciones ASP.NET Para aplicaciones ASP.NET, agregue la siguiente línea de código al método Application_Start en Global.asax.cs:

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

Aplicaciones de escritorio Para las aplicaciones de escritorio, agregue la siguiente línea de código para que se ejecute antes de realizar cualquier operación espacial:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Tarek El-Mallah
fuente
2
La instalación de SQL Server o NuGet no resolvió nada, esos simples tipos de CLR resolvieron el problema. Esta debería ser la solución aceptada.
Can Poyrazoğlu
1
El enlace a X64 me funcionó en Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 de octubre de 2016 18:17:30 Copyright (c) Microsoft Corporation Express Edition (64 bits) en Windows 10 Enterprise 6.3 <X64> (compilación 10586
:)
Necesitaba usar el cargador de estilo ASP.NET pero mi ruta de desarrollo era en ~/lugar de ~/bin. Asegúrese de revisar su ruta también.
jocull
Pude instalar el paquete de servidor SQL para la versión de SQL que quería, pero tenía que asegurarme de que la redirección de enlace apuntara a la versión instalada, ya que todas son diferentes para cada versión de servidor SQL.
Chris Rice
13

También encontré este problema, pero el paquete nuget Microsoft.SqlServer.Types ya estaba instalado.

Lo que resolvió el problema para mí fue ir a Solución> Referencias> System.Data.Entity> Propiedades> Copiar local y establecerlo en Verdadero.

Nota: Copiar local para Microsoft.SqlServer.Types ya estaba establecido en verdadero, y aunque el problema era con System.Data.Entity, el mensaje de error seguía siendo sobre Microsoft.SqlServer.Types.

La solución es del foro de Windows Azure .

Lumière inutilizable
fuente
1
Esta opción no está disponible en paquetes nuget.
Shimmy Weitzhandler
Es porque, como se mencionó, está en las opciones de propiedades de la referencia, no en las opciones de nuget :) ¡Gracias por su solución! Trabajó para mí
Emixam 23
8

Agregue "pendentAssembly "el archivo 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>

Esto funcionó para mi

Ertuğrul Üngör
fuente
5

La solución para mí fue simplemente agregar esta línea de código a Global.asax.cs en Application_Start():

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

Buena suerte hermanos.

devKoen1
fuente
3

Siguiendo un comentario en una respuesta para la publicación actual, agregar estas dos líneas (preferiblemente a la función principal) resolvió mi problema para la aplicación de consola:

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

En mi caso (una aplicación WebForms) resolví el problema agregando las siguientes líneas en Application_Startel Global.asaxarchivo.

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

Espero que esto ayude a alguien.

Dr. TJ
fuente
esto funcionó para el entorno VS 2019, última solución. gracias por compartir
codificador kemp
1

Ninguna de las soluciones anteriores me funcionó.

  • ¿Paquete de características de SQL Server instalado? si
  • ¿Paquete NuGet instalado? si
  • DLL existe en GAC y en el contenedor del proyecto? si

Sabes qué, este error también puede deberse a la falta de recursos en el servidor . Reinicié el servidor SQL y se resolvió automáticamente.

MPM
fuente
0

Solo tuve el mismo problema. Estoy usando una EF6llamada SQLque tiene una función SQL que usa comandos espaciales. Probé esto a través de una prueba unitaria y funcionó bien. Cuando fui a conectar mi Asp.Netsolución, recibí el error

Los tipos y funciones espaciales no están disponibles para este proveedor porque no se pudo encontrar el ensamblado 'Microsoft.SqlServer.Types' versión 10 o superior.

Mediante la adición de los NUGET"Microsoft.SqlServer.Types" paquete y añadiendo SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));a la Application_Start methodde Global.asax.cstodo funcionaba bien.

Bayer White
fuente
0

En mi caso, una cadena de conexión mal compuesta causó esto. Verifique si su cadena de conexión está compuesta correctamente.

Raghu Reddy Muttana
fuente