Impossibile trovare la versione 10 o successiva di "Microsoft.SqlServer.Types" in Azure


98

Sto cercando di creare un webapi in ASP.NET MVC 4. Il webapi ha utilizzato i tipi spaziali di Entity Framework 5 e ho scritto un codice molto semplice.

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

L'area contiene DbGeometry.

Quando eseguo questo locale funziona, ma quando lo pubblico su Azure mi dà questo errore:

I tipi e le funzioni spaziali non sono disponibili per questo provider perché non è stato possibile trovare l'assembly "Microsoft.SqlServer.Types" versione 10 o successiva.

Qualcuno sa come risolvere questo problema? :)

Grazie!


2
Stai usando i siti Web di Azure o un ruolo web nei servizi cloud? Inoltre, il tuo database è un database SQL Azure? Hai provato a eseguire il codice locale sul database SQL Azure e funziona?
Joe Capka

Risposte:


131

Ho trovato la soluzione! Basta installare il pacchetto nuget Microsoft.SqlServer.Types

PM> Pacchetto di installazione Microsoft.SqlServer.Types

Link per maggiori informazioni


4
Grazie. Questo mi è appena successo dopo che ho pubblicato alle 2 del mattino.
Lee Smith

3
Sono contento di aver messo su quel pacchetto di nuget! Mi prende sempre anche me.
Pure.Krome

OH MIO DIO! aggiunge quasi 2 MB di dati binari all'app Web solo per l'utilizzo di DbGeography (no grazie) è anche pesante sulla CPU quando lo si utilizza in SQL Server ...
Yovav

13
@Yovav, almeno stai girando su un floppy disk Non credo che 2 MB di dati binari abbiano alcuna influenza sulle prestazioni della tua applicazione. Ti consiglio di eseguire un benchmark e di farci sapere (con dati reali) l'impatto sulla CPU.
Diomedes Domínguez

3
Non era abbastanza per risolvere il problema, dovevo anche rispondere alla risposta di Chris .
Shimmy Weitzhandler

114

La risposta sopra funziona correttamente quando è possibile utilizzare la versione 11 (SQL Server 2012) dell'assembly.

Ho avuto un problema con questo perché la mia soluzione ha altre dipendenze dalla versione 13 (SQL Server 2016) dello stesso assembly. In questo caso si noti che Entity Framework (almeno v6.1.3) è hardcoded nel suo SqlTypesAssemblyLoader (l'origine di questa eccezione) per cercare solo le versioni 10 e 11 dell'assembly.

Per ovviare a questo ho scoperto che puoi dire a Entity Framework quale assembly vuoi usare in questo modo:

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

2
Ottimo posto: si applica anche alle macchine in cui è installato solo SQL 2014 CLR Types. Nel nostro caso, abbiamo appena installato i tipi CLR di SQL 2012 e il problema è stato risolto; ma se si ha una dipendenza specifica dalle versioni superiori degli assembly, questa sembra essere la soluzione migliore.
Andras Zoltan

1
È una proprietà pubblica statica. Dovrebbe essere impostato all'avvio dell'applicazione. Ad esempio, lo sto impostando nell'evento Application_Start nel Global.asax.cs della mia applicazione web.
Chris,

3
+1 Questa è l'unica cosa che ha funzionato per me. L'ho inserito nel costruttore della mia EntityContextclasse personalizzata (che eredita off DbContext).
Chris,

2
Ho salvato la mia pancetta!
Matt Cashatt

23
Per evitare l'hard-coding del nome dell'assembly puoi usareSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack

68

Per qualche motivo mi mancava un reindirizzamento vincolante che ha risolto questo problema per me.

L'aggiunta di quanto segue ha risolto il mio 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>

2
Per scoprire qual è il numero di versione di Microsoft.SqlServer.Types sulla tua macchina, puoi usare AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }dove _logger è un logger Nlog
Daniël Tulp

1
Questo ha risolto il mio problema (poiché i tipi erano già installati nel mio caso). Se qualcuno continua a ricevere l'errore dopo aver installato i tipi di SQL Server, controlla questa risposta.
Can Poyrazoğlu

1
@ R2D2 Grazie, questo ha risolto anche per me.
Ogglas

1
Ho installato SQLServerTypes e stavo ancora affrontando un problema. L'aggiunta di questo a web.config lo ha risolto per me.
saurabhj

25

Ci sono 2 modi per risolverlo:

  1. Se si dispone dell'accesso al server, è sufficiente installare "Tipi di CLR di sistema Microsoft per SQL Server 2012" da https://www.microsoft.com/en-us/download/details.aspx?id=29065 oppure utilizzare il collegamento diretto sotto il collegamento diretto a X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 oppure collegamento diretto a X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. Il secondo modo consiste nell'usare il gestore di pacchetti NuGet e installare

    Pacchetto di installazione Microsoft.SqlServer.Types

Quindi segui le note del plug-in come di seguito

Per distribuire un'applicazione che utilizza tipi di dati spaziali su una macchina in cui non è installato "Tipi CLR di sistema per SQL Server", è necessario distribuire anche l'assembly nativo SqlServerSpatial110.dll. Entrambe le versioni x86 (32 bit) e x64 (64 bit) di questo assembly sono state aggiunte al progetto nelle sottodirectory SqlServerTypes \ x86 e SqlServerTypes \ x64. L'assembly nativo msvcr100.dll è incluso anche nel caso in cui il runtime C ++ non sia installato.

È necessario aggiungere codice per caricare quello corretto di questi assembly in fase di esecuzione (a seconda dell'architettura corrente).

Applicazioni ASP.NET Per le applicazioni ASP.NET, aggiungere la seguente riga di codice al metodo Application_Start in Global.asax.cs:

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

Applicazioni desktop Per le applicazioni desktop, aggiungi la seguente riga di codice da eseguire prima di eseguire qualsiasi operazione spaziale:

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

2
L'installazione di SQL Server o NuGet non ha risolto nulla, quei semplici tipi CLR hanno risolto il problema. Questa dovrebbe essere la soluzione accettata.
Can Poyrazoğlu

1
Il collegamento a X64 funziona per me su Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 ottobre 2016 18:17:30 Copyright (c) Microsoft Corporation Express Edition (64 bit) su Windows 10 Enterprise 6.3 <X64> (Build 10586
:)

Avevo bisogno di utilizzare il caricatore in stile ASP.NET ma il mio percorso di sviluppo era ~/invece di ~/bin. Assicurati di controllare anche il tuo percorso.
jocull

Sono stato in grado di installare il pacchetto del server SQL per la versione di SQL che volevo, ma dovevo assolutamente assicurarmi che il reindirizzamento del binding fosse puntato sulla versione installata poiché sono tutti diversi per ogni versione del server SQL.
Chris Rice

13

Ho anche riscontrato questo problema, ma il pacchetto nuget Microsoft.SqlServer.Types era già installato.

Ciò che ha risolto il problema per me era andare su Soluzione> Riferimenti> System.Data.Entity> Proprietà> Copia locale e impostarlo su Vero.

Nota: Copia locale per Microsoft.SqlServer.Types era già impostato su true e anche se il problema riguardava System.Data.Entity, il messaggio di errore riguardava ancora Microsoft.SqlServer.Types.

La soluzione proviene dal forum di Windows Azure .


1
Questa opzione non è disponibile sui pacchetti nuget.
Shimmy Weitzhandler

È perché, come accennato, è nelle opzioni delle proprietà del riferimento, non nelle opzioni del nuget :) Grazie per la soluzione alternativa! Ha funzionato per me
Emixam23

8

Aggiungere "dependantAssembly" al file 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>

Questo ha funzionato per me


5

La soluzione per me era semplicemente aggiungere questa riga di codice a Global.asax.cs in Application_Start():

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

Buona fortuna fratelli miei.


3

A seguito di un commento in una risposta per il post corrente, l'aggiunta di queste due righe (preferibilmente alla funzione principale) ha risolto il mio problema per l'app Console:

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

2

Nel mio caso (un App WebForms) ho risolto il problema aggiungendo le seguenti righe nel Application_Startdel Global.asaxfile.

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

Spero che aiuti qualcuno.


questo ha funzionato per l'ambiente VS 2019, ultima correzione. grazie per la condivisione
coder kemp

1

Nessuna delle soluzioni di cui sopra mi ha funzionato.

  • Il Feature Pack di SQL Server è installato? sì
  • Pacchetto NuGet installato? sì
  • DLL esiste in GAC e nel cestino del progetto? sì

Sai cosa, questo errore può anche essere dovuto a poche risorse sul server . Ho riavviato il server SQL e si è risolto automaticamente.


0

Ho appena avuto lo stesso problema. Sto usando EF6e chiamando SQLche ha una funzione SQL che utilizza comandi spaziali. L'ho testato attraverso uno unit test e ha funzionato bene. Quando sono andato a collegare la mia Asp.Netsoluzione ho ricevuto l'errore

I tipi e le funzioni spaziali non sono disponibili per questo provider perché non è stato possibile trovare l'assembly "Microsoft.SqlServer.Types" versione 10 o successiva.

Aggiungendo il NUGETpacchetto "Microsoft.SqlServer.Types" e aggiungendo SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));a Application_Start methodin Global.asax.cstutto ha funzionato bene.


0

Nel mio caso, una stringa di connessione composta male ha causato questo. Verifica se la tua stringa di connessione è composta correttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.