'Microsoft.SqlServer.Types' Version 10 oder höher konnte in Azure nicht gefunden werden

97

Ich versuche, ein Webapi in ASP.NET MVC 4 zu erstellen. Das Webapi verwendete Entity Framework 5 Spatial-Typen und ich habe einen sehr einfachen Code geschrieben.

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

Der Bereich enthält DbGeometry.

Wenn ich dieses lokale System ausführe, funktioniert es, aber wenn ich es in Azure veröffentliche, wird folgende Fehlermeldung angezeigt:

Räumliche Typen und Funktionen sind für diesen Anbieter nicht verfügbar, da die Assembly 'Microsoft.SqlServer.Types' Version 10 oder höher nicht gefunden wurde.

Weiß jemand, wie man das löst? :) :)

Vielen Dank!

Thomas Bolander
quelle
2
Verwenden Sie Azure-Websites oder eine Webrolle in Cloud Services? Ist Ihre Datenbank auch eine SQL Azure-Datenbank? Haben Sie versucht, Ihren lokalen Code für die SQL Azure-Datenbank auszuführen, und funktioniert das?
Joe Capka

Antworten:

130

Ich habe die Lösung gefunden! Installieren Sie einfach das Nuget-Paket Microsoft.SqlServer.Types

PM> Installationspaket Microsoft.SqlServer.Types

Link für weitere Informationen

Thomas Bolander
quelle
4
Vielen Dank. Das ist mir gerade passiert, nachdem ich um 2 Uhr morgens veröffentlicht habe.
Lee Smith
3
Ich bin froh, dass ich das Nuget-Paket zusammengestellt habe! Es bringt mich auch immer.
Pure.Krome
OH MEIN GOTT! Es fügt der Web-App fast 2 MB Binärdaten hinzu, nur um DbGeography zu verwenden (nein, danke). Es ist auch sehr CPU-belastend, wenn es in SQL Server verwendet wird.
Yovav
13
@Yovav, zumindest laufen Sie auf einer Diskette. Ich glaube nicht, dass 2 MB Binärdaten einen Einfluss auf die Leistung Ihrer Anwendung haben. Ich empfehle Ihnen, einen Benchmark durchzuführen und uns (mit realen Daten) die Auswirkungen auf die CPU mitzuteilen.
Diomedes Domínguez
3
Das war nicht genug, um das Problem zu lösen, ich musste auch Chris 'Antwort machen .
Shimmy Weitzhandler
114

Die obige Antwort funktioniert einwandfrei, wenn Version 11 (SQL Server 2012) der Assembly verwendet werden kann.

Ich hatte ein Problem damit, da meine Lösung andere Abhängigkeiten von Version 13 (SQL Server 2016) derselben Assembly aufweist. Beachten Sie in diesem Fall, dass Entity Framework (mindestens Version 6.1.3) in seinem SqlTypesAssemblyLoader (der Quelle dieser Ausnahme) fest codiert ist, um nur nach den Versionen 10 und 11 der Assembly zu suchen.

Um dies zu umgehen, können Sie Entity Framework mitteilen, welche Assembly Sie wie folgt verwenden möchten:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Chris
quelle
2
Toller Ort - gilt auch für Computer, auf denen nur SQL 2014 CLR-Typen installiert sind. In unserem Fall haben wir gerade die SQL 2012-CLR-Typen installiert und das Problem behoben. Wenn Sie jedoch eine bestimmte Abhängigkeit von den höheren Versionen der Assemblys haben, scheint dies die beste Lösung zu sein.
Andras Zoltan
1
Es ist ein statisches öffentliches Eigentum. Sie sollte beim Start der Anwendung festgelegt werden. Beispiel: Ich setze es im Application_Start-Ereignis in der Datei Global.asax.cs meiner Webanwendung.
Chris
3
+1 Dies ist das einzige, was für mich funktioniert hat. Ich habe es in den Konstruktor meiner benutzerdefinierten EntityContextKlasse eingefügt (die erbt DbContext).
Chris
2
Habe meinen Speck gerettet!
Matt Cashatt
22
Um zu vermeiden, dass der Name der Baugruppe fest codiert wird, können Sie ihn verwendenSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack,
68

Aus irgendeinem Grund fehlte mir eine verbindliche Weiterleitung, die dieses Problem für mich behoben hat.

Das Hinzufügen des Folgenden hat mein Problem behoben

    <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
quelle
2
Um herauszufinden, wie die Versionsnummer von Microsoft.SqlServer.Types auf Ihrem AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }Computer lautet , können Sie verwenden, wo _logger ein Nlog-Logger ist
Daniël Tulp
1
Dies löste mein Problem (da in meinem Fall bereits Typen installiert waren). Wenn nach der Installation von SQL Server-Typen immer noch jemand den Fehler erhält, überprüfen Sie diese Antwort.
Kann Poyrazoğlu
1
@ R2D2 Danke, das hat es auch für mich behoben.
Ogglas
1
Ich habe SQLServerTypes installiert und hatte immer noch ein Problem. Das Hinzufügen zur web.config hat es für mich behoben.
Saurabhj
24

Es gibt zwei Möglichkeiten, dies zu beheben:

  1. Wenn Sie Serverzugriff haben, installieren Sie einfach "Microsoft System CLR-Typen für SQL Server 2012" unter https://www.microsoft.com/en-us/download/details.aspx?id=29065 oder verwenden Sie den direkten Link unter dem direkten Link zu X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 oder direkter Link zu X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. Die zweite Möglichkeit besteht darin, den NuGet-Paketmanager zu verwenden und zu installieren

    Installationspaket Microsoft.SqlServer.Types

Folgen Sie dann den folgenden Plugin-Hinweisen

Um eine Anwendung, die räumliche Datentypen verwendet, auf einem Computer bereitzustellen, auf dem 'System CLR Types for SQL Server' nicht installiert ist, müssen Sie auch die native Assembly SqlServerSpatial110.dll bereitstellen. In den Unterverzeichnissen SqlServerTypes \ x86 und SqlServerTypes \ x64 wurden Ihrem Projekt sowohl x86- (32 Bit) als auch x64-Versionen (64 Bit) dieser Assembly hinzugefügt. Die native Assembly msvcr100.dll ist ebenfalls enthalten, falls die C ++ - Laufzeit nicht installiert ist.

Sie müssen Code hinzufügen, um zur Laufzeit die richtige dieser Assemblys zu laden (abhängig von der aktuellen Architektur).

ASP.NET-Anwendungen Fügen Sie für ASP.NET-Anwendungen der Application_Start-Methode in Global.asax.cs die folgende Codezeile hinzu:

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

Desktop-Anwendungen Fügen Sie für Desktop-Anwendungen die folgende Codezeile hinzu, die ausgeführt werden soll, bevor räumliche Operationen ausgeführt werden:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Tarek El-Mallah
quelle
2
Die Installation von SQL Server oder NuGet hat nichts gelöst. Diese einfachen CLR-Typen haben das Problem gelöst. Dies sollte die akzeptierte Lösung sein.
Kann Poyrazoğlu
1
Der Link zu X64 funktioniert für mich unter Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28. Oktober 2016, 18:17:30 Uhr Copyright (c) Microsoft Corporation Express Edition (64-Bit) unter Windows 10 Enterprise 6.3 <X64> (Build 10586 :)
zapoo
Ich musste den ASP.NET-Loader verwenden, aber mein Entwicklungspfad war ~/anstelle von ~/bin. Überprüfen Sie auch Ihren Pfad.
Jocull
Ich konnte das SQL Server Pack für die gewünschte SQL-Version installieren, musste jedoch unbedingt sicherstellen, dass die Bindungsumleitung auf die installierte Version verweist, da sie für jede SQL Server-Version unterschiedlich sind.
Chris Rice
13

Ich bin auch auf dieses Problem gestoßen, aber das Nuget-Paket Microsoft.SqlServer.Types wurde bereits installiert.

Was das Problem für mich gelöst hat, war, zu Lösung> Referenzen> System.Data.Entity> Eigenschaften> Lokal kopieren zu gehen und es auf True zu setzen.

Hinweis: Copy Local für Microsoft.SqlServer.Types wurde bereits auf true gesetzt, und obwohl das Problem bei System.Data.Entity lag, handelte es sich bei der Fehlermeldung immer noch um Microsoft.SqlServer.Types.

Die Lösung stammt aus dem Windows Azure-Forum .

Unverwendbares Lumière
quelle
1
Diese Option ist für Nuget-Pakete nicht verfügbar.
Shimmy Weitzhandler
Dies liegt daran, dass es, wie bereits erwähnt, in den Eigenschaftenoptionen der Referenz und nicht in den Optionen des Nugets enthalten ist :) Vielen Dank für Ihre Problemumgehung! Arbeitete für mich
Emixam23
8

Bitte fügen Sie der Datei "Web.config" "abhängige Baugruppe" hinzu

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

Das hat bei mir funktioniert

Ertuğrul Üngör
quelle
5

Die Lösung für mich bestand darin, diese Codezeile zu Global.asax.cs hinzuzufügen Application_Start():

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

Viel Glück, meine Brüder.

devKoen1
quelle
3

Nach einem Kommentar in einer Antwort für den aktuellen Beitrag löste das Hinzufügen dieser beiden Zeilen (vorzugsweise zur Hauptfunktion) mein Problem für die Konsolen-App:

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

Keine der oben genannten Lösungen hat mir geholfen.

  • SQL Server Feature Pack installiert? Ja
  • NuGet-Paket installiert? Ja
  • DLL existiert im GAC und im Projektfach? Ja

Weißt du was? Dieser Fehler kann auch auf geringe Ressourcen auf dem Server zurückzuführen sein . Ich habe SQL Server neu gestartet und es wurde automatisch behoben.

MPM
quelle
1

In meinem Fall (einer WebForms-App) habe ich das Problem gelöst, indem ich die folgenden Zeilen in Application_Startdie Global.asaxDatei eingefügt habe .

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

Ich hoffe es hilft jemandem.

Dr. TJ
quelle
Dies funktionierte für die VS 2019-Umgebung, neueste Korrektur. danke fürs teilen
coder kemp
0

Hatte gerade das gleiche Problem. Ich verwende EF6und rufe SQLeine SQL-Funktion auf, die räumliche Befehle verwendet. Ich habe dies durch einen Unit-Test getestet und es hat gut funktioniert. Als ich meine Asp.NetLösung verkabelte, erhielt ich den Fehler

Räumliche Typen und Funktionen sind für diesen Anbieter nicht verfügbar, da die Assembly 'Microsoft.SqlServer.Types' Version 10 oder höher nicht gefunden wurde.

Durch Hinzufügen des NUGETPakets "Microsoft.SqlServer.Types" und Hinzufügen SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));zu dem Application_Start methodin Global.asax.csalles funktionierte gut.

Bayer Weiß
quelle
0

In meinem Fall hat dies eine schlecht zusammengesetzte Verbindungszeichenfolge verursacht. Überprüfen Sie, ob Ihre Verbindungszeichenfolge richtig zusammengesetzt ist.

Raghu Reddy Muttana
quelle