Получение «System.Data.SqlClient не поддерживается на этой платформе» при запуске в качестве инструмента dotnet cli - PullRequest
9 голосов
/ 22 мая 2019

У нас есть простое консольное приложение Netcore 2.2, использующее DbContext из Microsoft.EntityFrameworkCore. При запуске из консоли все работает как положено.

Однако мы решили использовать его как dotnet CLI . Это .csproj файл содержит:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AssemblyName>dotnet-dbupdate</AssemblyName>
    <Title>Db Updater</Title>
    <Version>1.0.1</Version>
    <PackageId>DbUpdater</PackageId>
    <Product>DbUpdater</Product>
    <PackageVersion>1.0.1</PackageVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
  </ItemGroup>
</Project>

Мы упаковываем его на наш сервер Nuget с dotnet pack. Затем в целевой папке у нас есть следующий файл .csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="DbUpdater" Version="1.0.1" />
  </ItemGroup>
</Project>

Из этой папки мы восстанавливаем ее и выполняем:

dotnet restore
dotnet dbupdate

И вдруг при DbSet вызове ToList метода мы получаем:

System.Data.SqlClient is not supported on this platform

Определенно, существует проблема с запуском его как инструмента CLI dotnet. Однако пока мы не смогли понять, что это за проблема и как ее решить. Поиск в Интернете не дал нам никаких идей, что попробовать.

Ответы [ 3 ]

0 голосов
/ 29 мая 2019

Попробуйте указать версию .NET для CLI:

dotnet dbupdate --fx-version 2.2.4

Если вышеприведенное не работает, попробуйте и другую версию, которую вы установили (2.2.2).

По сути, версия .NET, используемая для запуска из CLI, целевой SDK консольного приложения и версии пакетов зависимостей должны совпадать, чтобы избежать проблем несовместимости.

0 голосов
/ 02 июня 2019

Если вы разрабатываете проект с Asp.net core 2.2, обратите внимание на следующие проблемы

Компилятор не может переместить dll-файлы в целевую папку, когда вы изменяете настройки целевого проекта (параметры запуска на cli) или вводите (от класса lib до стандартного lib) или удаляете некоторые зависимости из раздела nuget. (Ошибка компилятора и Microsoft исправили это в версии 2 против 2019 г.) Вы можете попробовать переместить его вручную, но это не гарантировано. Понижение рейтинга может привести к изменению в этом случае.

Компилятор ядра фреймворка Asp.net смотрит в основном на файл проекта, а другие упомянутые модули имеют меньший приоритет. dotnet restore and dotnet update не может предоставить настройки в соответствии с нашими изменениями. Например, если вы удалили пакет и выполнили команду -dotnet restore, после взгляда на часть зависимости от nuget в Visual Studio. Возможно, они все еще там. По этой причине вы пытаетесь поместить Microsoft.EntityFrameworkCore.SqlServer в окончательный файл окончательного проекта.

решение с указанным выше

Автономное приложение. В этом случае, если вы используете DLL, связанную с другим приложением (например, драйвером SQLBase), или вы можете поместить другие зависимости nuget в свое приложение, изолировав эти библиотеки DLL. Это дает вам возможность работать с другими ресурсами в системе. В вашем случае вы должны сделать это для Microsoft.EntityFrameworkCore.SqlServer

<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>

Пожалуйста, напишите комментарий, если вы не согласны

0 голосов
/ 28 мая 2019

Обратите внимание, что метод ToList() запускает команду SQL, например, при первом использовании соответствующей библиотеки DLL.Итак, просто ваша ошибка говорит о том, что существует несоответствие зависимостей для Microsoft.EntityFrameworkCore.SqlServer или System.Data.SqlClient, вы знаете, что второй является зависимостью для первый .Существуют некоторые зависимости и для второй , однако, я думаю, что ваша проблема не в этом.

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

Редактировать

Согласно документации dotnet-pack :

Зависимости NuGet упакованного проекта добавляются в файл .nuspec, поэтому они правильно разрешаются при установке пакета.Ссылки между проектами не упакованы внутри проекта.В настоящее время вы должны иметь пакет для каждого проекта, если у вас есть зависимости от проекта к проекту.

Веб-проекты по умолчанию не упаковываются.Чтобы переопределить поведение по умолчанию, добавьте свойство <IsPackable>true</IsPackable> (внутри <PropertyGroup>) к вашему .csproj файлу.

Я думаю, вам нужно включить следующее в ваш .csproj file:

<ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
    <PackageReference Include="System.Data.SqlClient" Version="4.4.0"/>
</ItemGroup>

Кроме того, больше нет необходимости использовать dotnet restore на основании следующих данных из dotnet-pack документации :

Запускс .NET Core 2.0 вам не нужно запускать dotnet restore, потому что он запускается неявно всеми командами, такими как dotnet build и dotnet run, для которых требуется восстановление.Это все еще допустимая команда в определенных сценариях, где имеет смысл выполнить явное восстановление.

...