La version 10 ou supérieure de «Microsoft.SqlServer.Types» est introuvable sur Azure

98

J'essaie de créer une webapi dans ASP.NET MVC 4. La webapi a utilisé les types Spatial Entity Framework 5 et j'ai écrit un code très simple.

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

La zone contient DbGeometry.

Lorsque je lance ce local, cela fonctionne, mais lorsque je le publie sur Azure, cela me donne cette erreur:

Les types et fonctions spatiaux ne sont pas disponibles pour ce fournisseur car l'assembly «Microsoft.SqlServer.Types» version 10 ou supérieure est introuvable.

Quelqu'un sait comment résoudre ceci ? :)

Merci!

Thomas Bolander
la source
2
Utilisez-vous des sites Web Azure ou un rôle Web dans les services cloud? De plus, votre base de données est-elle une base de données SQL Azure? Avez-vous essayé d'exécuter votre code local sur la base de données SQL Azure et cela fonctionne-t-il?
Joe Capka

Réponses:

131

J'ai trouvé la solution! Installez simplement le package nuget Microsoft.SqlServer.Types

PM> Package d'installation Microsoft.SqlServer.Types

Lien pour plus d'informations

Thomas Bolander
la source
4
Merci. Cela m'est arrivé juste après avoir publié à 2 heures du matin.
Lee Smith
3
Heureux d'avoir mis en place ce paquet de pépites! Cela m'attire toujours aussi.
Pure.Krome
OMG! il ajoute près de 2 Mo de données binaires à l'application Web juste pour utiliser DbGeography (non merci), il est également lourd en CPU lors de son utilisation dans SQL Server ... en le supprimant.
Yovav
13
@Yovav, au moins vous utilisez une disquette Je ne pense pas que 2 Mo de données binaires aient une quelconque influence sur les performances de votre application. Je vous suggère de faire un benchmark et de nous faire savoir (avec des données réelles) l'impact sur le CPU.
Diomedes Domínguez
3
Cela ne suffisait pas pour résoudre le problème, je devais aussi faire la réponse de Chris .
Shimmy Weitzhandler
114

La réponse ci-dessus fonctionne correctement lorsque la version 11 (SQL Server 2012) de l'assembly peut être utilisée.

J'ai eu un problème avec cela car ma solution a d'autres dépendances sur la version 13 (SQL Server 2016) du même assembly. Dans ce cas, notez qu'Entity Framework (au moins v6.1.3) est codé en dur dans son SqlTypesAssemblyLoader (la source de cette exception) pour rechercher uniquement les versions 10 et 11 de l'assembly.

Pour contourner ce problème, j'ai découvert que vous pouvez indiquer à Entity Framework quel assembly vous souhaitez utiliser comme ceci:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Chris
la source
2
Excellent point - s'applique également aux machines sur lesquelles seuls les types SQL 2014 CLR sont installés. Dans notre cas, nous venons d'installer les types SQL 2012 CLR et cela a résolu le problème; mais si vous avez une dépendance spécifique sur les versions supérieures des assemblys, cela semble être la meilleure solution.
Andras Zoltan
1
C'est une propriété publique statique. Il doit être défini au démarrage de l'application. Par exemple, je le mets dans l'événement Application_Start dans Global.asax.cs de mon application Web.
Chris
3
+1 C'est la seule chose qui a fonctionné pour moi. Je l'ai mis dans le constructeur de ma EntityContextclasse personnalisée (qui hérite de DbContext).
Chris
2
J'ai sauvé mon bacon!
Matt Cashatt
23
Pour éviter de coder en dur le nom de l'assemblage, vous pouvez utiliserSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack
68

Pour une raison quelconque, je manquais une redirection de liaison qui a résolu ce problème pour moi.

L'ajout de ce qui suit a résolu mon problème

    <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>
Seigneur Dark Vador
la source
2
Afin de savoir quel est le numéro de version des Microsoft.SqlServer.Types sur votre machine, vous pouvez utiliser AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }where _logger est un enregistreur Nlog
Daniël Tulp
1
Cela a résolu mon problème (car les types étaient déjà installés dans mon cas). Si quelqu'un obtient toujours l'erreur après l'installation de types de serveur SQL, vérifiez cette réponse.
Can Poyrazoğlu
1
@ R2D2 Merci, cela a résolu le problème pour moi aussi.
Ogglas
1
J'ai installé SQLServerTypes et j'étais toujours confronté à un problème. L'ajout de ceci au web.config l'a corrigé pour moi.
saurabhj
25

Il existe 2 façons de résoudre ce problème:

  1. Si vous avez accès au serveur, installez simplement «Microsoft System CLR Types for SQL Server 2012» à partir de https://www.microsoft.com/en-us/download/details.aspx?id=29065 Ou utilisez le lien direct sous le lien direct vers X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 , ou lien direct vers X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. La deuxième façon consiste à utiliser le gestionnaire de packages NuGet et à installer

    Package d'installation Microsoft.SqlServer.Types

Ensuite, suivez les notes du plugin comme ci-dessous

Pour déployer une application qui utilise des types de données spatiales sur une machine sur laquelle les «types de CLR système pour SQL Server» ne sont pas installés, vous devez également déployer l'assembly natif SqlServerSpatial110.dll. Les versions x86 (32 bits) et x64 (64 bits) de cet assembly ont été ajoutées à votre projet sous les sous-répertoires SqlServerTypes \ x86 et SqlServerTypes \ x64. L'assembly natif msvcr100.dll est également inclus au cas où le runtime C ++ n'est pas installé.

Vous devez ajouter du code pour charger le bon de ces assemblys au moment de l'exécution (en fonction de l'architecture actuelle).

Applications ASP.NET Pour les applications ASP.NET, ajoutez la ligne de code suivante à la méthode Application_Start dans Global.asax.cs:

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

Applications de bureau Pour les applications de bureau, ajoutez la ligne de code suivante à exécuter avant toute opération spatiale:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Tarek El-Mallah
la source
2
L'installation de SQL Server ou NuGet n'a rien résolu, ces types CLR simples ont résolu le problème. Cela devrait être la solution acceptée.
Can Poyrazoğlu
1
Le lien vers X64 fonctionne pour moi sur Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 octobre 2016 18:17:30 Copyright (c) Microsoft Corporation Express Edition (64 bits) sur Windows 10 Entreprise 6.3 <X64> (Build 10586
:)
J'avais besoin d'utiliser le chargeur de style ASP.NET mais mon chemin de développement était à la ~/place de ~/bin. Assurez-vous également de vérifier votre chemin.
jocull
J'ai pu installer le pack de serveur SQL pour la version de SQL que je voulais, mais je devais absolument m'assurer que la redirection de liaison était pointée vers la version installée car elles sont toutes différentes pour chaque version de serveur SQL.
Chris Rice
13

J'ai également rencontré ce problème, mais le package nuget Microsoft.SqlServer.Types était déjà installé.

Ce qui a résolu le problème pour moi allait à Solution> Références> System.Data.Entity> Propriétés> Copier local et le définissant sur True.

Remarque: Copy Local pour Microsoft.SqlServer.Types était déjà défini sur true, et même si le problème concernait System.Data.Entity, le message d'erreur concernait toujours Microsoft.SqlServer.Types.

La solution provient du forum Windows Azure .

Lumière inutilisable
la source
1
Cette option n'est pas disponible sur les packages nuget.
Shimmy Weitzhandler
C'est parce que, comme mentionné, c'est dans les options de propriétés de la référence, pas dans les options du nuget :) Merci pour votre solution de contournement! A travaillé pour moi
Emixam23
8

Veuillez ajouter "dependAssembly" le fichier 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>

Cela a fonctionné pour moi

Ertuğrul Üngör
la source
5

La solution pour moi était simplement d'ajouter cette ligne de code à Global.asax.cs dans Application_Start():

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

Bonne chance mes frères.

devKoen1
la source
3

Suite à un commentaire dans une réponse pour le post actuel, l'ajout de ces deux lignes (de préférence à la fonction principale) a résolu mon problème pour l'application console:

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

Dans mon cas (une application WebForms), j'ai résolu le problème en ajoutant les lignes suivantes dans Application_Startle Global.asaxfichier.

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

J'espère que cela aide quelqu'un.

Dr TJ
la source
cela a fonctionné pour l'environnement VS 2019, dernier correctif. merci pour le partage
coder kemp
1

Aucune des solutions ci-dessus ne m'a fonctionné.

  • Pack de fonctionnalités SQL Server installé? Oui
  • Package NuGet installé? Oui
  • DLL existe dans GAC et dans le bac du projet? Oui

Vous savez quoi, cette erreur peut également être due à de faibles ressources sur le serveur . J'ai redémarré le serveur SQL et il a été résolu automatiquement.

MPM
la source
0

J'ai juste eu le même problème. J'utilise EF6et j'appelle SQLqui a une fonction SQL qui utilise des commandes spatiales. J'ai testé cela via un test unitaire et cela a bien fonctionné. Quand je suis allé câbler ma Asp.Netsolution, j'ai reçu l'erreur

Les types et fonctions spatiaux ne sont pas disponibles pour ce fournisseur car l'assembly «Microsoft.SqlServer.Types» version 10 ou supérieure est introuvable.

En ajoutant le NUGETpackage "Microsoft.SqlServer.Types" et en ajoutant SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));au Application_Start methoddans Global.asax.cstout a bien fonctionné.

Bayer Blanc
la source
0

Dans mon cas, une chaîne de connexion mal composée a causé cela. Vérifiez si votre chaîne de connexion est correctement composée.

Raghu Reddy Muttana
la source