Nie można znaleźć „Microsoft.SqlServer.Types” w wersji 10 lub nowszej na platformie Azure

98

Próbuję zrobić webapi w ASP.NET MVC 4. Webapi użyło typów Entity Framework 5 Spatial i napisałem bardzo prosty kod.

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

Obszar zawiera DbGeometry.

Kiedy uruchamiam ten lokalny, działa, ale kiedy publikuję go na lazurze, wyświetla mi się ten błąd:

Typy i funkcje przestrzenne nie są dostępne dla tego dostawcy, ponieważ nie można znaleźć zestawu „Microsoft.SqlServer.Types” w wersji 10 lub nowszej.

Czy ktoś wie, jak to rozwiązać? :)

Dzięki!

Thomas Bolander
źródło
2
Czy używasz witryn sieci Web platformy Azure lub roli sieci Web w usługach w chmurze? Czy Twoja baza danych jest bazą danych SQL Azure? Czy próbowałeś uruchomić swój kod lokalny w bazie danych SQL Azure i czy to działa?
Joe Capka

Odpowiedzi:

131

Znalazłem rozwiązanie! Wystarczy zainstalować pakiet NuGet Microsoft.SqlServer.Types

PM> Install-Package Microsoft.SqlServer.Types

Link, aby uzyskać więcej informacji

Thomas Bolander
źródło
4
Dzięki. Przydarzyło mi się to po prostu po opublikowaniu o 2 w nocy.
Lee Smith
3
Cieszę się, że wystawiłem ten pakiet nuget! Mnie też zawsze trafia.
Pure.Krome
O MÓJ BOŻE! dodaje prawie 2 MB danych binarnych do aplikacji internetowej tylko po to, aby używać DbGeography (nie, dziękuję), jest również obciążony procesorem podczas używania go w SQL Server ... wyjmując go.
Yovav
13
@Yovav, przynajmniej pracujesz na dyskietce. Nie sądzę, aby 2 MB danych binarnych miało jakikolwiek wpływ na wydajność twojej aplikacji. Sugeruję wykonanie testu porównawczego i poinformowanie nas (z prawdziwymi danymi) o wpływie na procesor.
Diomedes Domínguez
3
To nie wystarczyło, aby rozwiązać problem, musiałem też odpowiedzieć Chrisowi .
Shimmy Weitzhandler
114

Powyższa odpowiedź działa poprawnie, gdy można użyć wersji 11 (SQL Server 2012) zestawu.

Miałem z tym problem, ponieważ moje rozwiązanie ma inne zależności w wersji 13 (SQL Server 2016) tego samego zestawu. W tym przypadku należy zauważyć, że Entity Framework (co najmniej w wersji 6.1.3) jest zakodowana na stałe w jego SqlTypesAssemblyLoader (źródło tego wyjątku), aby szukać tylko wersji 10 i 11 zestawu.

Aby obejść ten problem, odkryłem, że możesz powiedzieć Entity Framework, którego zestawu chcesz użyć w następujący sposób:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Chris
źródło
2
Świetne miejsce - dotyczy również maszyn, na których są zainstalowane tylko typy SQL 2014 CLR. W naszym przypadku właśnie zainstalowaliśmy typy SQL 2012 CLR i rozwiązaliśmy problem; ale jeśli masz określoną zależność od wyższych wersji zestawów, to wydaje się być najlepszym rozwiązaniem.
Andras Zoltan
1
To statyczna właściwość publiczna. Powinien być ustawiony przy starcie aplikacji. Np. Ustawiam to w zdarzeniu Application_Start w Global.asax.cs mojej aplikacji internetowej.
Chris,
3
+1 To jedyna rzecz, która zadziałała dla mnie. Umieściłem go w konstruktorze mojej EntityContextklasy niestandardowej (która dziedziczy DbContext).
Chris,
2
Uratowałem mój bekon!
Matt Cashatt,
23
Aby uniknąć zakodowania na stałe nazwy zespołu, którego możesz użyćSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack
68

Z jakiegoś powodu brakowało mi przekierowania wiążącego, które rozwiązało ten problem.

Dodanie następującego rozwiązania rozwiązało mój problem

    <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
źródło
2
Aby dowiedzieć się, jaki jest numer wersji z Microsoft.SqlServer.Types na komputerze, można użyć AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }gdzie _logger jest rejestrator nlog
Daniël Tulp
1
To rozwiązało mój problem (ponieważ typy były już zainstalowane w moim przypadku). Jeśli po zainstalowaniu typów SQL Server nadal pojawia się błąd, sprawdź tę odpowiedź.
Can Poyrazoğlu
1
@ R2D2 Dziękuję, to również rozwiązało problem.
Ogglas
1
Zainstalowałem SQLServerTypes i nadal miałem problem. Dodanie tego do web.config naprawiło to za mnie.
saurabhj
25

Istnieją 2 sposoby, aby to naprawić:

  1. Jeśli masz dostęp do serwera, po prostu zainstaluj „Microsoft System CLR Types for SQL Server 2012” z https://www.microsoft.com/en-us/download/details.aspx?id=29065 lub użyj bezpośredniego łącza poniżej bezpośredniego łącza do X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 lub bezpośredni link do X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. Drugim sposobem jest użycie menedżera pakietów NuGet i zainstalowanie

    Zainstaluj pakiet Microsoft.SqlServer.Types

Następnie postępuj zgodnie z uwagami dotyczącymi wtyczki, jak poniżej

Aby wdrożyć aplikację korzystającą z typów danych przestrzennych na komputerze, na którym nie zainstalowano „Systemowych typów CLR dla programu SQL Server”, należy również wdrożyć zestaw natywny SqlServerSpatial110.dll. Wersje x86 (32-bitowe) i x64 (64-bitowe) tego zestawu zostały dodane do projektu w podkatalogach SqlServerTypes \ x86 i SqlServerTypes \ x64. Natywny zestaw msvcr100.dll jest również uwzględniony w przypadku, gdy środowisko wykonawcze C ++ nie jest zainstalowane.

Musisz dodać kod, aby załadować poprawny jeden z tych zestawów w czasie wykonywania (w zależności od bieżącej architektury).

Aplikacje ASP.NET W przypadku aplikacji ASP.NET dodaj następujący wiersz kodu do metody Application_Start w Global.asax.cs:

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

Aplikacje klasyczne W przypadku aplikacji komputerowych dodaj następujący wiersz kodu, który będzie uruchamiany przed wykonaniem jakichkolwiek operacji przestrzennych:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Tarek El-Mallah
źródło
2
Zainstalowanie SQL Server lub NuGet niczego nie rozwiązało, te proste typy CLR rozwiązały problem. To powinno być przyjęte rozwiązanie.
Can Poyrazoğlu
1
Łącze do X64 działa dla mnie w Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 października 2016 18:17:30 Copyright (c) Microsoft Corporation Express Edition (64-bit) w systemie Windows 10 Enterprise 6.3 <X64> (kompilacja 10586
:)
Musiałem użyć programu ładującego w stylu ASP.NET, ale ~/zamiast tego moja ścieżka rozwoju była ~/bin. Pamiętaj, aby sprawdzić również swoją ścieżkę.
żartobliwy
Udało mi się zainstalować pakiet serwera SQL dla wersji SQL, którą chciałem, ale absolutnie musiałem upewnić się, że przekierowanie powiązania zostało skierowane na zainstalowaną wersję, ponieważ wszystkie są różne dla każdej wersji serwera SQL.
Chris Rice,
13

Również napotkałem ten problem, ale pakiet nuget Microsoft.SqlServer.Types został już zainstalowany.

Rozwiązaniem dla mnie było przejście do opcji Rozwiązanie> Referencje> System.Data.Entity> Właściwości> Kopiuj lokalnie i ustawienie wartości True.

Uwaga: opcja Kopiuj lokalnie dla Microsoft.SqlServer.Types została już ustawiona na wartość true i mimo że problem dotyczył System.Data.Entity, komunikat o błędzie nadal dotyczył Microsoft.SqlServer.Types.

Rozwiązanie pochodzi z forum Windows Azure .

Nieużywany Lumière
źródło
1
Ta opcja nie jest dostępna w pakietach nuget.
Shimmy Weitzhandler
Dzieje się tak, ponieważ, jak wspomniano, znajduje się w opcjach właściwości odwołania, a nie w opcjach nuget :) Dziękujemy za obejście! Pracował dla mnie
Emixam23
9

Dodaj plik „dependAssembly” do pliku 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>

To zadziałało dla mnie

Ertuğrul Üngör
źródło
5

Rozwiązaniem dla mnie było po prostu dodanie tej linii kodu do Global.asax.cs w Application_Start():

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

Powodzenia bracia.

devKoen1
źródło
3

Po komentarzu w odpowiedzi na bieżący post, dodanie tych dwóch wierszy (najlepiej do głównej funkcji) rozwiązało mój problem z aplikacją konsolową:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Saeed Mohtasham
źródło
3

W moim przypadku (a WebForms app) I rozwiązać problem dodając następujące wiersze w Application_Starttego Global.asaxpliku.

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

Mam nadzieję, że to komuś pomoże.

Dr TJ
źródło
1
działało to dla środowiska VS 2019, najnowsza poprawka. dzięki za udostępnienie
koder kemp
1

Żadne z powyższych rozwiązań nie zadziałało.

  • Zainstalowano pakiet funkcji programu SQL Server? tak
  • Zainstalowano pakiet NuGet? tak
  • DLL istnieje w GAC i w bin projektu? tak

Wiesz co, ten błąd może być również spowodowany niskimi zasobami na serwerze . Zrestartowałem serwer SQL i problem został rozwiązany automatycznie.

MPM
źródło
0

Po prostu miałem ten sam problem. Używam EF6i wzywam, SQLktóry ma funkcję SQL, która używa poleceń przestrzennych. Przetestowałem to za pomocą testu jednostkowego i działało dobrze. Kiedy poszedłem podłączyć swoje Asp.Netrozwiązanie, otrzymałem błąd

Typy i funkcje przestrzenne nie są dostępne dla tego dostawcy, ponieważ nie można znaleźć zestawu „Microsoft.SqlServer.Types” w wersji 10 lub nowszej.

Dodając NUGETpakiet „Microsoft.SqlServer.Types” i dodanie SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));do Application_Start methodw Global.asax.cswszystko działało dobrze.

Bayer White
źródło
0

W moim przypadku spowodował to źle skomponowany ciąg połączenia. Sprawdź, czy parametry połączenia są poprawnie skomponowane.

Raghu Reddy Muttana
źródło