Ответ 1
Я нашел решение! Просто установите пакет nuget Microsoft.SqlServer.Types
PM > Установить пакет Microsoft.SqlServer.Types
Я пытаюсь создать webapi в ASP.NET MVC 4. Webapi использовал Entity Framework 5 Spatial типов, и я написал очень простой код.
public List<Area> GetAllAreas()
{
List<Area> aList = db.Areas.ToList();
return aList;
}
Область содержит DbGeometry.
Когда я запускаю этот локальный, он работает, но когда я публикую его на лазурном, он дает мне эту ошибку:
Пространственные типы и функции недоступны для этого провайдера, потому что не удалось найти сборку "Microsoft.SqlServer.Types" версии 10 или выше.
Кто-нибудь знает, как это решить?:)
Спасибо!
Я нашел решение! Просто установите пакет nuget Microsoft.SqlServer.Types
PM > Установить пакет Microsoft.SqlServer.Types
Ответ выше работает нормально, когда можно использовать версию 11 (SQL Server 2012) сборки.
У меня была проблема с этим, поскольку у моего решения есть другие зависимости от версии 13 (SQL Server 2016) той же сборки. В этом случае обратите внимание, что Entity Framework (по крайней мере v6.1.3) жестко закодирован в его SqlTypesAssemblyLoader (источник этого исключения), чтобы искать только версии 10 и 11 сборки.
Чтобы обойти это, я обнаружил, что вы можете указать Entity Framework, какую сборку вы хотите использовать, вот так:
SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
По какой-то причине мне не хватало переадресации привязки, которая исправила эту проблему для меня.
Добавление следующей исправленной проблемы
<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>
Есть два способа исправить это:
Второй способ - использовать диспетчер пакетов NuGet и установить
Установочный пакет Microsoft.SqlServer.Types
Затем следуйте за комментариями плагинов ниже
Развернуть приложение, использующее типы пространственных данных для машины у которого нет "Системных CLR-типов для SQL Server", установленных вами также необходимо развернуть собственную сборку SqlServerSpatial110.dll. И то и другое x86 (32-разрядные) и 64-разрядные версии этой сборки были добавлен в ваш проект под SqlServerTypes\x86 и SqlServerTypes\x64 подкаталоги. Собственная сборка msvcr100.dll также включается в случае, если среда выполнения С++ не установлена.
Вам нужно добавить код для загрузки правильной одной из этих сборок в (в зависимости от текущей архитектуры).
Приложения ASP.NET Для приложений ASP.NET добавьте следующую строку кода к методу Application_Start в Global.asax.cs:
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
Настольные приложения Для настольных приложений добавьте следующую строку кода для запуска до выполнения любых пространственных операций:
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Я также столкнулся с этой проблемой, но пакет nuget Microsoft.SqlServer.Types уже установлен.
Что решила проблема для меня, я собираюсь решить проблему > Ссылки > System.Data.Entity > Свойствa > Скопировать локальную и установить ее в True.
Примечание: Копировать локальное для Microsoft.SqlServer.Types уже установлено значение true, и хотя проблема была в System.Data.Entity, сообщение об ошибке по-прежнему содержалось в Microsoft.SqlServer.Types.
Решение от форум Windows Azure.
Пожалуйста, добавьте "зависящий от сборки" файл 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>
Это работает для меня
Решение для меня просто добавило эту строку кода в Global.asax.cs в Application_Start()
:
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
Удачи моим братьям.
После комментария в ответе на текущее сообщение добавление этих двух строк (предпочтительно в основную функцию) решило мою проблему для консольного приложения:
SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Ни один из вышеперечисленных решений не работал.
Знаете, эта ошибка также может быть вызвана низкими ресурсами на сервере. Я перезапустил SQL-сервер, и он автоматически разрешился.
Просто такая же проблема. Я использую EF6
и вызываю SQL
, у которого есть функция SQL, которая использует пространственные команды. Я тестировал это через unit test, и он работал нормально. Когда я подключился к моему решению Asp.Net
, я получил ошибку
Пространственные типы и функции для этого провайдера недоступны потому что сборка "Microsoft.SqlServer.Types" версии 10 или выше не удалось найти.
Добавив пакет NUGET
"Microsoft.SqlServer.Types" и добавив SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
в Application_Start method
в Global.asax.cs
, все сработало нормально.
В моем случае это вызвало плохо составленную строку подключения. Проверьте правильность составления строки подключения.
В моем случае (приложение 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";
Я надеюсь, что это кому-то поможет.