作为dotnet cli工具启动时,获取“此平台上不支持System.Data.SqlClient”

时间:2019-05-22 12:10:25

标签: c# entity-framework .net-core dotnet-cli

我们有一个简单的netcore 2.2控制台应用程序,使用了DbContext中的Microsoft.EntityFrameworkCore。从控制台启动后,它可以按预期工作。

但是,我们决定将其用作dotnet CLI tool。 .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>

我们使用dotnet pack将其打包到我们的Nuget服务器。然后在目标文件夹中,有以下.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的{​​{1}}方法调用中,我们收到:

ToList

无疑,将其作为dotnet CLI工具启动时存在问题。但是,我们仍然没有得到这个问题的含义和解决方法。在网上搜索并没有给我们任何尝试的思路。

6 个答案:

答案 0 :(得分:0)

尝试指定用于CLI的.NET版本:

dotnet dbupdate --fx-version 2.2.4

如果上述方法不起作用,请尝试使用已安装的其他版本(2.2.2)。

从本质上说,用于从CLI运行的.NET版本,控制台应用程序的目标SDK和依赖项的软件包版本都必须匹配,以免出现不兼容问题。

答案 1 :(得分:0)

只需将兼容性v2添加到local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "FUNCTIONS_V2_COMPATIBILITY_MODE": "true"
  }
}

答案 2 :(得分:0)

我遇到了相同的问题,这是由于使用了错误的System.Data.SqlClient版本而导致的,在我的情况下,应用程序是使用.NET 4.6和.Net Standard 2.0中的类库构建的对System.Data.SqlClient的依赖。 在生产环境中替换适当版本的System.Data.SqlClient(以我为例的.NET 4.6)后,此问题已解决。

答案 3 :(得分:0)

如果要在Linux OS上运行它,只需确保使用正确的 Target Runtime 发布解决方案。例如,如果要在 Red Hat Enterprise Linux 上运行,请选择linux-x64。

答案 4 :(得分:-1)

请注意,ToList()方法会触发SQL命令,例如,第一次使用相应的DLL。因此,您的错误仅表示Microsoft.EntityFrameworkCore.SqlServerSystem.Data.SqlClient的依赖项不匹配,您知道第二个第一个的依赖项>。 第二个也有一些依赖关系,但是我认为您的问题并非由此而来。

打包后签出默认参考(版本),并尝试更改为合适的参考(版本)。不幸的是,我们无法重现您的问题,因此请尝试此解决方案并让我们知道结果。

修改

根据dotnet-pack documentation

  

打包项目的NuGet依赖项添加到.nuspec   文件,因此在安装软件包时可以正确解决它们。   项目之间的引用未打包在项目内部。   目前,如果您有,每个项目都必须有一个软件包   项目之间的依赖关系。

     

默认情况下不打包Web项目。覆盖默认值   行为,请添加<IsPackable>true</IsPackable>属性(在内部   <PropertyGroup>)到您的 .csproj 文件。

我认为您需要在.csproj文件中添加以下内容:

<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-pack documentation中的以下内容,不再需要使用dotnet restore

  

从.NET Core 2.0开始,您不必运行dotnet restore   因为它是由所有命令隐式运行的,例如dotnet build和   dotnet run,需要进行还原。还是有效的   在某些情况下执行显式还原的命令   感。

答案 5 :(得分:-1)

如果您正在使用Asp.net core 2.2开发项目,请注意以下问题

当您更改目标项目设置(将启动项目设置为cli)或键入(将类lib更改为标准lib)或从nuget部分删除了一些目录时,编译器无法将dll文件移动到目标文件夹。 (编译器错误和Microsoft在vs 2019的前2版中对此进行了纠正)您可以尝试手动移动它,但不能保证。在这种情况下,降级可能是一种限制。

Asp.net框架核心编译器主要查看项目文件,而其他引用的模块则优先级较低。 dotnet restore and dotnet update无法根据我们的更改提供设置。例如,如果您在查看Visual Studio的Nuget依赖部分之后,删除了一个软件包并发出了-dotnet restore命令。他们也许仍然在那里。 因此,您尝试将 Microsoft.EntityFrameworkCore.SqlServer 放置到最终项目的最终文件中。

具有上述解决方案的

自包含应用程序。 在这种情况下,如果您使用的是与另一个应用程序相关的DLL(例如SQLBase驱动程序),或者可以通过隔离这些DLL将其他nuget依赖项放到您的应用程序中。这使您可以灵活地使用系统中的其他资源。在您的情况下,您应该对 Microsoft.EntityFrameworkCore.SqlServer

执行此操作
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>

如果您不同意,请发表评论