13

Одна из наших библиотек классов использует пространственные типы Microsoft, такие как DbGeography. При запуске нашего приложения на чистой машине без старых версий SQL Server и Visual Studio, мы получим это исключение:Как использовать SqlServer.Types/пространственные типы в приложении ASP.NET Core 1.0

Пространственные типы и функции недоступны для этого поставщика потому сборки «Microsoft.SqlServer.Types» версии 10 или выше не удалось найти.

Решение, по-видимому, чтобы установить этот NuGet пакет:

Install-Package Microsoft.SqlServer.Types 

После установки пакета NuGet дает инструкции о том, как ссылаться на библиотеки DLL из каждого типа проекта:

Чтобы развернуть приложение, которое использует пространственные типы данных для машины, на которой не установлены «Системные CLR-типы для SQL Server», вам также необходимо развернуть собственную сборку SqlServerSpatial110.dll.

Оба x86 (32-разрядных) и 64-разрядных версии этой сборки были добавлены в ваш проект под подкаталогами SqlServerTypes \ x86 и SqlServerTypes \ x64. Собственная сборка msvcr100.dll также включена в случае, если среда выполнения C++ не установлена.

Вам нужно добавить код для загрузки правильной одной из этих сборок во время выполнения (в зависимости от текущей архитектуры).

приложений ASP.NET для приложений ASP.NET, добавьте следующую строку кода в методе Application_Start в Global.asax.cs: SqlServerTypes.Utilities.LoadNativeAssemblies (Server.MapPath ("~/бен")) ;

Настольные приложения для настольных приложений, добавьте следующую строку кода для запуска, прежде чем какие-либо пространственные операции: SqlServerTypes.Utilities.LoadNativeAssemblies (AppDomain.CurrentDomain.BaseDirectory);

NuGet сайт пакет проектов не отвечает на запросы, так что я не уверен, что это лучший подход к использованию в настоящее время в 2016 году

Моя проблема в том, что я не могу понять, как позвонить LoadNativeAssemblies из приложение ASP.NET Core 1.0. Мы используем полный каркас (net461), а не основной каркас.

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     ... 
     SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath); 
     ... 
    } 
} 

Что это лучший способ, чтобы включить SqlServer.Types DLL файлы в пределах 1.0 приложения ASP.NET?

Связанные вопросы here и here on StackOverflow.

Большое спасибо.

+0

Вы получили что-то с этим? –

+0

Никаких успехов. Я все еще надеюсь выяснить это ... – Ender2050

+0

Из любопытства, что происходит, t включить эту строку? В моем проекте .NET Framework мне не нужно было загружать сборки вручную, и это работало нормально. Мне еще не удалось запустить его на .NET Core из-за других проблем совместимости. –

ответ

0

это, казалось, работал для меня:

public class Startup 
    { 
     public Startup(IHostingEnvironment env) 
     { 
      ... 
      SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath + @"path to the project that contains the SQLServerTypes folder"); 
      ... 
     } 
    } 

Я заметил, что IHostingEnvironment.WebRootPath возвращает путь, который указывает на Wwwroot однако в моей установке решения у меня есть несколько проектов в этой папке, поэтому просто говорю это какой проект Это помогло мне. Извините, если это не поможет.

+1

также при отладке это сработало для меня 'SqlServerTypes.Utilities.LoadNativeAssemblies (HostingEnvironment.MapPath (" ~/bin "));' – Nova

0

Я зафиксировал его, его не чистое исправление, на самом деле это все, но чистый:

Я должен был создать папку в/bin именованных пакетов с типами серверов пакета SQL ... И я должен был сделать это в каждом проекте, на который ссылается ядро ​​asp net, использующее серверные типы sql, поэтому он, похоже, является ошибкой или misscheheviour в файлах целей.

Обратите внимание, что это обходное решение должно выполняться всеми в вашей команде, поскольку содержимое/bin не будет находиться под контролем источника, как и ожидалось.

Я надеюсь, что это помогает (пока она фиксируется)

(Ну, это слишком поздно, завтра я буду думать немного больше о том, что причиной этой проблемы и как я установил его, и если я найти лучший обходной путь Я дам вам знать, знаю, что он строит и запускается, как ожидалось)

2

Я получил эту работу над основным приложением ASP.NET сегодня (.NET Framework внизу, а не .NET Core, так же, как и исходный плакат).

Я заметил, что добавление пакета Nuget непосредственно на мой основной сайт ASP.NET не дало никаких дополнительных файлов. Не уверен, что пакеты постоянно обновлялись для работы с ASP.NET Core?

Во всяком случае, я просто добавил пакет к традиционному проекту .NET Framework 4.x и вырезал созданную им папку SqlServerTypes, а затем поместил эту папку в корень моего проекта ASP.NET Core. Изменено свойство Copy to Output Dicrectory для всех 4 DLL под Do not copy по отношению к Copy Always и добавлен звонок в LoadLibrary().

Стоит отметить, что версия пакета 14.x на самом деле является SQL vNext, которая отсутствует, она должна была быть помечена как предварительный релиз в моем сознании. Я придерживался 13.x, так как мы используем SQL 2016.

Первоначально я поместил это в файл Program.cs, поскольку он не имел никакого отношения к Middleware, ServiceInjection или настройке конфигурации хостинга. Но тогда вы должны получить Путь, чтобы пройти от отражения, которое казалось уродливым. Поэтому я поставил его как первую строку конструктора Startup, так как оттуда я могу использовать путь HostingEnvironment.

public Startup(IHostingEnvironment env) 
{ 
    SqlServerTypes.Utilities.LoadNativeAssemblies(env.ContentRootPath); 

    //The normal config as usual down here... 
    var configuration = new ConfigurationBuilder() 
     .SetBasePath(env.ContentRootPath) 
     .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
     .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
     .AddEnvironmentVariables(); 
} 
+0

I ' вы попробовали это и даже можете пройти через LoadNativeAssemblies, чтобы убедиться, что он вызван, но я все еще получаю ошибки, когда на самом деле использую типы t hout EF, указав «Microsoft.SqlServer.Types» версии 10 или выше, не удалось найти. Ты сделал что-нибудь еще? –

+0

Вам также может потребоваться добавить 'SqlProviderServices.SqlServerTypesAssemblyName = typeof (SqlGeography) .Assembly.FullName;' после вызова 'LoadNativeAssemblies'. См. Https://stackoverflow.com/a/40166192/1727 –

+0

У меня не было этого в моем случае, но я не использовал Entity Framework, хотя понимаю, что исходный вопрос был отмечен EF, хотя пост никогда фактически упомянул об этом. Шаги, которые я упоминал, были DAL агностиками. Является ли это релевантным в EF6 или EF Core? –

4

Я исправлю это с помощью bindingRedirect в файле web.config.

<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> 

им с помощью SQL 2016, ASP.NET (без сердцевины) и EF 6.0.0.0

+0

Этот вопрос определенно касается ядра ASP.NET, поэтому ваш ответ никоим образом не является полезным. – Stijn

0

Использование .net ядра 2.0. После установки пакета nuget, упомянутого выше, я помещал его в Program.cs перед строкой с BuildWebHost (args) .Run(); и это сработало.

Утилиты.LoadNativeAssemblies (AppDomain.CurrentDomain.BaseDirectory); SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version = 14.0.0.0, Культура = нейтральная, PublicKeyToken = 89845dcd8080cc91 ";