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 часа ночи.
Ли Смит
3
Рад, что поднял этот пакет nuget! Меня это всегда тоже заводит.
Pure.Krome
О, МОЙ БОГ! он добавляет почти 2 МБ двоичных данных в веб-приложение только для использования DbGeography (нет, спасибо), он также загружает процессор при использовании в SQL Server ... вынимая его.
Yovav
13
@Yovav, по крайней мере, вы работаете с дискетой, я не думаю, что 2 МБ двоичных данных могут повлиять на производительность вашего приложения. Я предлагаю вам запустить тест и сообщить нам (с реальными данными) о влиянии на процессор.
Диомедес Домингес
3
Этого было недостаточно, чтобы решить проблему, мне также пришлось ответить Крису .
Шимми Вайцхандлер
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
Отличное место - также относится к машинам, на которых установлены только типы SQL 2014 CLR. В нашем случае мы только что установили SQL 2012 CLR Types и устранили проблему; но если у вас есть конкретная зависимость от более высоких версий сборок, то это, по-видимому, лучшее решение.
Андрас Золтан
1
Это статическое публичное свойство. Он должен быть установлен при запуске приложения. Например, я устанавливаю его в событии Application_Start в файле Global.asax.cs моего веб-приложения.
Крис
3
+1 Это единственное, что у меня сработало. Я поместил его в конструктор своего настраиваемого EntityContextкласса (который наследуется DbContext).
Крис
2
Спас мой бекон!
Мэтт Кашатт
23
Чтобы избежать жесткого кодирования имени сборки, которое вы можете использоватьSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Сэмюэл Джек
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
Даниэль
1
Это решило мою проблему (поскольку в моем случае типы уже были установлены). Если у кого-то по-прежнему возникает ошибка после установки SQL Server Types, проверьте этот ответ.
Кан Пойразоглу
1
@ R2D2 Спасибо, это исправило и для меня.
Ogglas
1
Я установил SQLServerTypes, но проблема не исчезла. Добавление этого в web.config исправило это для меня.
saurabhj
25

Есть 2 способа исправить это:

  1. Если у вас есть доступ к серверу, просто установите «Типы Microsoft System CLR для 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 решили проблему. Это должно быть приемлемое решение.
Джан Пойразоглу
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 :)
zapoo 02
Мне нужно было использовать загрузчик стиля ASP.NET, но мой путь разработки был ~/вместо ~/bin. Не забудьте также проверить свой путь.
jocull
Мне удалось установить пакет SQL-сервера для версии SQL, которую я хотел, но мне абсолютно необходимо было убедиться, что перенаправление привязки было указано на установленную версию, поскольку все они разные для каждой версии SQL-сервера.
Крис Райс,
13

Я тоже столкнулся с этой проблемой, но пакет nuget Microsoft.SqlServer.Types уже был установлен.

Что решило проблему для меня, это Решение> Ссылки> System.Data.Entity> Свойства> Копировать локально и установка для него значения True.

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

Решение взято с форума Windows Azure .

Неиспользуемый Люмьер
источник
1
Этот параметр недоступен в пакетах nuget.
Шимми Вайцхандлер
Это потому, что, как уже упоминалось, он находится в параметрах свойств ссылки, а не в параметрах nuget :) Спасибо за обходной путь! Работал на меня
Emixam23
9

Пожалуйста, добавьте файл 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"));

Удачи, братья мои.

devKoen1
источник
3

После комментария в ответе на текущую публикацию добавление этих двух строк (предпочтительно к основной функции) решило мою проблему для консольного приложения:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Саид Мохташам
источник
3

В моем случае (а 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";

Надеюсь, это кому-то поможет.

Д-р TJ
источник
1
это сработало для среды VS 2019, последнее исправление. спасибо за то, что поделился
coder kemp
1

Ни одно из вышеперечисленных решений не помогло мне.

  • Пакет дополнительных компонентов SQL Server установлен? да
  • Пакет NuGet установлен? да
  • DLL существует в GAC и в корзине проекта? да

Вы знаете, что эта ошибка также может быть связана с нехваткой ресурсов на сервере . Я перезапустил SQL-сервер, и он разрешился автоматически.

MPM
источник
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

В моем случае причиной этого была неправильно составленная строка подключения. Убедитесь, что ваша строка подключения правильно составлена.

Рагху Редди Муттана
источник