"Microsoft.SqlServer.Types" версии 10 или выше не найден в Azure
Я пытаюсь создать веб-интерфейс в ASP.NET MVC 4. Веб-интерфейс использовал пространственные типы Entity Framework 5, и я написал очень простой код.
public List<Area> GetAllAreas()
{
List<Area> aList = db.Areas.ToList();
return aList;
}
Область содержит DbGeometry.
Когда я запускаю этот локальный файл, он работает, но когда я публикую его в Azure, он выдаст мне эту ошибку:
Пространственные типы и функции недоступны для этого провайдера, поскольку не удалось найти сборку "Microsoft.SqlServer.Types" версии 10 или выше.
Кто-нибудь знает, как решить эту проблему?:)
Спасибо!
13 ответов
Я нашел решение! Просто установите пакет nuget Microsoft.SqlServer.Types
PM> Install-Package Microsoft.SqlServer.Types
Ответ выше работает нормально, когда можно использовать версию 11 (SQL Server 2012) сборки.
У меня была проблема с этим, поскольку мое решение имеет другие зависимости от версии 13 (SQL Server 2016) той же сборки. В этом случае обратите внимание, что Entity Framework (по крайней мере v6.1.3) жестко закодирован в его SqlTypesAssemblyLoader (источник этого исключения), чтобы искать только версии 10 и 11 сборки.
Чтобы обойти это, я обнаружил, что вы можете указать Entity Framework, какую сборку вы хотите использовать, вот так:
SqlProviderServices.SqlServerTypesAssemblyName =
"Microsoft.SqlServer.Types, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
По какой-то причине мне не хватало перенаправления привязки, которое исправило эту проблему для меня.
Добавление следующего исправило мою проблему
<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>
Есть два способа исправить это:
- Если у вас есть доступ к серверу, просто установите "Microsoft System CLR Types для 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
Второй способ - использовать менеджер пакетов 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);
Пожалуйста, добавьте "зависящий от сборки" файл 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>
Это работает для меня
Я также столкнулся с этой проблемой, но пакет nuget Microsoft.SqlServer.Types уже был установлен.
Для решения этой проблемы мне нужно было выбрать Solution > References > System.Data.Entity > Properties > Copy Local и установить для него значение True.
Примечание. Для параметра " Копировать локально для Microsoft.SqlServer.Types" уже задано значение "истина", и, хотя проблема была в System.Data.Entity, сообщение об ошибке по-прежнему касалось Microsoft.SqlServer.Types.
Решение от форума Windows Azure.
Решением для меня было просто добавить эту строку кода в Global.asax.cs в Application_Start()
:
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
Удачи, мои братья.
После комментария в ответе на текущее сообщение добавление этих двух строк (предпочтительно в основную функцию) решило мою проблему для консольного приложения:
SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
В моем случае (приложение WebForms) я решил проблему, добавив следующие строки в 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";
Надеюсь, это кому-то поможет.
Ни одно из вышеперечисленных решений мне не помогло.
- Пакет SQL Server Feature Pack установлен? да
- Пакет NuGet установлен? да
- DLL существует в GAC и в проекте bin? да
Вы знаете, что эта ошибка также может быть из-за нехватки ресурсов на сервере. Я перезапустил SQL-сервер, и он был решен автоматически.
Просто была такая же проблема. я использую 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
все работало нормально.
В моем случае это плохо скомпонованная строка соединения. Проверьте, правильно ли составлена строка подключения.
Ни один из них не работал у меня, потому что в Visual Studio 2017 есть ошибка. Он создает обе папки типов серверов sql вне проекта, но не распознается в global.asax.
Я просто перетаскиваю из папки вне проекта внутрь проекта, после чего он регонируется в глобальный и работает.