web-dev-qa-db-fra.com

'Microsoft.SqlServer.Types' version 10 ou supérieure introuvable sur Azure

J'essaie de créer une webapi dans ASP.NET MVC 4. La webapi utilisait les types Entity Framework 5 Spatial 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.

Quand je lance ce local, ça marche, mais quand je le publie sur Azure, ça me donne cette erreur:

Les types et les fonctions spatiaux ne sont pas disponibles pour ce fournisseur car la version 10 ou supérieure de l'assembly 'Microsoft.SqlServer.Types' ou une version ultérieure était introuvable.

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

Merci!

77
Thomas Bolander

J'ai trouvé la solution! Il suffit d'installer le package de nuget Microsoft.SqlServer.Types

PM> Install-Package Microsoft.SqlServer.Types

Lien pour plus d'infos

112
Thomas Bolander

Le answer above fonctionne correctement lorsque la version 11 (SQL Server 2012) de 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 la version 6.1.3) est codé en dur dans son SqlTypesAssemblyLoader (source de cette exception) pour rechercher uniquement les versions 10 et 11 de Assembly.

Pour résoudre ce problème, j’ai découvert que vous pouvez indiquer à Entity Framework quel assembleur vous souhaitez utiliser, par exemple:

SqlProviderServices.SqlServerTypesAssemblyName =
    "Microsoft.SqlServer.Types, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
76
Chris

Pour une raison quelconque, il me manquait une redirection de liaison qui corrigeait 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>
53
R2D2

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

  1. Si vous avez un accès au serveur, installez simplement «Types de CLR système Microsoft pour SQL Server 2012» C’est à partir de https://www.Microsoft.com/en-us/download/details.aspx?id=29065 Ou utilisez le lien direct ci-dessous 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 paquets NuGet et à l’installer.

    Package d'installation Microsoft.SqlServer.Types

Suivez ensuite les notes du plugin ci-dessous

Pour déployer une application qui utilise des types de données spatiales sur une machine "Types de CLR système pour SQL Server" n'est pas installé sur votre ordinateur également besoin de déployer l’Assembly natif SqlServerSpatial110.dll. Tous les deux Les versions x86 (32 bits) et x64 (64 bits) de cet assemblage ont été ajouté à votre projet sous SqlServerTypes\x86 et SqlServerTypes\x64 sous-répertoires. L'assemblée native msvcr100.dll est également inclus dans le cas où le runtime C++ n'est pas installé. 

Vous devez ajouter du code pour charger le bon assemblage à runtime (selon l'architecture actuelle). 

Applications ASP.NET Pour les applications ASP.NET, ajoutez la ligne suivante de code à 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 suivante de code à exécuter avant toute opération spatiale: 

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
21
Tarek El-Mallah

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

Ce qui a résolu le problème pour moi, ce fut d'aller dans Solution> Références> System.Data.Entity> Propriétés> Copier local et de le définir 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 de Forum Windows Azure .

13
Inusable Lumière

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

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

Bonne chance mes frères.

4
devKoen1

S'il vous plaît 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

3
Ertuğrul Üngör

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

  • SQL Server Feature Pack installé? Oui
  • Le paquet NuGet est-il installé? Oui
  • DLL existe dans GAC et dans la corbeille de projet? Oui

Vous savez quoi, cette erreur peut aussi être due à ressources insuffisantes sur le serveur . J'ai redémarré le serveur SQL et le problème a été résolu automatiquement. 

1
MPM

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.

0

Je viens d'avoir le même problème. J'utilise EF6 et appelle SQL qui a une fonction SQL qui utilise des commandes spatiales. J'ai testé cela à travers un test unitaire et cela a bien fonctionné. Quand je suis allé câbler ma solution Asp.Net j'ai reçu l'erreur 

Les types et fonctions spatiaux ne sont pas disponibles pour ce fournisseur parce que la version 10 ou supérieure de l'Assembly 'Microsoft.SqlServer.Types' Ne peut être trouvé.

En ajoutant le package NUGET "Microsoft.SqlServer.Types" et en ajoutant SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin")); au Application_Start method dans Global.asax.cs, tout s'est bien passé.

0
Bayer White

Après un commentaire dans une réponse au message en cours, 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);
0
Saeed Mohtasham