"Microsoft.SqlServer.Types" версії 10 або новішої не вдалося знайти в Azure


98

Я намагаюся створити webapi в ASP.NET MVC 4. Webapi використовував Entity Framework 5 Просторові типи, і я написав дуже простий код.

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

Область містить DbGeometry.

Коли я запускаю цей локальний файл, він працює, але коли я публікую його для блакитного, він видає мені цю помилку:

Просторові типи та функції недоступні для цього постачальника, оскільки не вдалося знайти збірку 'Microsoft.SqlServer.Types' версії 10 або новішої.

Хтось знає, як це вирішити? :)

Дякую!


2
Ви використовуєте веб-сайти Azure або веб-роль у хмарних службах? Також ваша база даних є базою даних SQL Azure? Ви пробували запускати свій локальний код проти бази даних SQL Azure, і це працює?
Джо Капка

Відповіді:


131

Я знайшов рішення! Просто встановіть nuget-пакет Microsoft.SqlServer.Types

PM> Встановити-пакет Microsoft.SqlServer.Types

Посилання для отримання додаткової інформації


4
Дякую. Це трапилося зі мною після того, як я опублікував у 2 години ночі.
Lee Smith

3
Радий, що я поклав цей самородний пакет! Це завжди мене також вражає.
Pure.Krome

О БОЖЕ МІЙ! він додає майже 2 МБ двійкових даних у веб-програму лише для використання DbGeography (ні, дякую), це також важко для процесора, коли він використовується в SQL Server ... виймає його.
Йовав

13
@Yovav, принаймні ви працюєте на дискеті, я не думаю, що 2 МБ двійкових даних мають якийсь вплив на продуктивність вашої програми. Я пропоную вам запустити орієнтир і повідомити нам (за допомогою реальних даних) вплив на процесор.
Діомед Домінгес

3
Цього було недостатньо для вирішення проблеми, мені довелося також відповісти на відповідь Кріса .
Shimmy Weitzhandler

114

Відповідь вище працює відмінно , коли версія 11 (SQL Server 2012) вузла може бути використаний.

У мене була проблема з цим, оскільки моє рішення має інші залежності від версії 13 (SQL Server 2016) тієї самої збірки. У цьому випадку зверніть увагу, що Entity Framework (принаймні v6.1.3) жорстко закодований у своєму SqlTypesAssemblyLoader (джерело цього винятку), щоб шукати лише версії 10 та 11 збірки.

Щоб обійти це, я виявив, що ви можете сказати Entity Framework, яку збірку ви хочете використовувати так:

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

2
Чудове місце - це також стосується машин, де встановлені лише типи CLR SQL 2014. У нашому випадку ми щойно встановили типи CLR SQL 2012, і це вирішило проблему; але якщо у вас є конкретна залежність від вищих версій збірок, це, мабуть, є найкращим рішенням.
Андраш Золтан,

1
Це статична публічна власність. Його слід встановити під час запуску програми. Наприклад, я встановлюю це в події Application_Start у Global.asax.cs мого веб-додатку.
Кріс

3
+1 Це єдине, що мені вдалося. Я помістив його в конструктор мого користувацького EntityContextкласу (який успадковується від DbContext).
Кріс

2
Врятував мій бекон!
Matt Cashatt,

23
Щоб уникнути жорсткого кодування назви збірки, яку ви можете використовуватиSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack

68

З якоїсь причини мені не вистачало перенаправлення на прив’язку, яке вирішило цю проблему для мене.

Додавання наступного вирішило мою проблему

    <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
Для того , щоб з'ясувати , що номер версії з Microsoft.SqlServer.Types на вашій машині, ви можете використовувати AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }де _logger є реєстратор Nlog
Daniël Tulp

1
Це вирішило мою проблему (оскільки типи вже були встановлені в моєму випадку). Якщо хтось все-таки отримує помилку після встановлення типів SQL Server, перевірте цю відповідь.
Can Poyrazoğlu

1
@ R2D2 Дякую, це також для мене це виправило.
Огглас

1
Я встановив SQLServerTypes і все ще стикався з проблемою. Додавши це до web.config, це виправлено для мене.
saurabhj

25

Існує 2 способи виправити це:

  1. Якщо у вас є доступ до сервера, просто встановіть “Типи CLR системи Microsoft для SQL Server 2012”, це з https://www.microsoft.com/en-us/download/details.aspx?id=29065 Або використовуйте пряме посилання під прямим посиланням до X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 , або Пряме посилання на X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. Другий спосіб - використовувати менеджер пакунків NuGet та встановити

    Інсталяційний пакет Microsoft.SqlServer.Types

Потім дотримуйтесь приміток про плагін, як показано нижче

Для розгортання програми, яка використовує просторові типи даних, на машині, на якій не встановлено „Системні типи CLR для SQL Server”, вам також потрібно розгорнути власну збірку SqlServerSpatial110.dll. Як x86 (32-розрядна), так і x64 (64-розрядна) версії цієї збірки були додані до вашого проекту в підкаталогах SqlServerTypes \ x86 та SqlServerTypes \ x64. Власна збірка msvcr100.dll також включена на випадок, якщо середовище виконання C ++ не встановлено.

Вам потрібно додати код, щоб завантажити правильну одну з цих збірок під час виконання (залежно від поточної архітектури).

Програми ASP.NET Для програм ASP.NET додайте такий рядок коду до методу Application_Start у Global.asax.cs:

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

Настільні програми Для настільних програм додайте наступний рядок коду, який потрібно виконати перед виконанням будь-яких просторових операцій:

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

2
Встановлення SQL Server або NuGet нічого не вирішило, ці прості типи CLR вирішили проблему. Це має бути прийнятим рішенням.
Can Poyrazoğlu

1
Посилання на X64 працює для мене в Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 жовтня 2016 18:17:30 Авторське право (c) Microsoft Corporation Express Edition (64-розрядна версія) в Windows 10 Enterprise 6.3 <X64> (
збірка 10586:)

Мені потрібно було використовувати завантажувач стилю ASP.NET, але мій шлях розвитку був ~/замість ~/bin. Не забудьте також перевірити свій шлях.
jocull

Мені вдалося встановити пакет SQL-серверів для тієї версії SQL, яку я хотів, але я абсолютно повинен був переконатися, що перенаправлення на прив'язку було вказано на встановлену версію, оскільки всі вони різні для кожної версії SQL-сервера.
Chris Rice,

13

Я також зіткнувся з цією проблемою, але пакет nuget Microsoft.SqlServer.Types уже був встановлений.

Що вирішило проблему для мене, це перейти до Solution> References> System.Data.Entity> Properties> Copy Local і встановити для True.

Примітка: Копіювати локальний для Microsoft.SqlServer.Types уже було встановлено значення true, і хоча проблема була в System.Data.Entity, повідомлення про помилку все ще стосувалося Microsoft.SqlServer.Types.

Рішення на форумі Windows Azure .


1
Ця опція недоступна на пакунках nuget.
Shimmy Weitzhandler

Це тому, що, як уже згадувалося, це у параметрах властивостей посилання, а не в параметрах самородка :) Дякую за ваш обхідний шлях! Працював у мене
Emixam23,

8

Будь ласка, додайте файл "dependAssembly" файл 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>

Це спрацювало для мене


5

Рішенням для мене було просто додавання цього рядка коду до Global.asax.cs у Application_Start():

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

Успіхів мої брати.


3

Після коментаря у відповіді на поточну публікацію, додавання цих двох рядків (переважно до основної функції) вирішило мою проблему для програми Console:

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

2

У моєму випадку (а WebForms App) Я вирішив цю проблему , додавши наступні рядки в Application_Startз Global.asaxфайлу.

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

Сподіваюся, це комусь допоможе.


це спрацювало для середовища VS 2019, останнє виправлення. спасибі за обмін
кодер kemp

1

Жодне з наведених вище рішень мене не спрацювало.

  • Встановлено пакет функцій SQL Server? Так
  • Встановлено пакет NuGet? Так
  • DLL існує у GAC та у контейнері проекту? Так

Знаєте, ця помилка також може бути пов’язана з низьким рівнем ресурсів на сервері . Я перезапустив сервер SQL, і він вирішився автоматично.


0

Просто була та сама проблема. Я використовую EF6та викликаю SQLфункцію SQL, яка використовує просторові команди. Я перевірив це за допомогою модульного тесту, і він працював нормально. Коли я пішов підключати своє Asp.Netрішення, я отримав помилку

Просторові типи та функції недоступні для цього постачальника, оскільки не вдалося знайти збірку 'Microsoft.SqlServer.Types' версії 10 або новішої.

При додаванні NUGETпакету «Microsoft.SqlServer.Types» і додавши SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));до Application_Start methodв Global.asax.csусі працювало відмінно.


0

У моєму випадку це спричинило неправильно складений рядок з'єднання. Переконайтеся, що рядок підключення правильно складений.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.