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

hor*_*rgh 9 c# entity-framework .net-core dotnet-cli

我们有一个使用DbContextfrom 的简单netcore 2.2控制台应用程序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>
Run Code Online (Sandbox Code Playgroud)

我们使用将其打包到我们的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>
Run Code Online (Sandbox Code Playgroud)

从此文件夹中,将其还原并执行:

dotnet restore
dotnet dbupdate
Run Code Online (Sandbox Code Playgroud)

突然之间,在DbSetToList方法调用中,我们收到:

System.Data.SqlClient is not supported on this platform
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*rzi -1

请注意,该ToList()方法会触发 SQL 命令,例如,第一次使用相应的 DLL 时。因此,您的错误只是表明 There's a dependency mismatch for Microsoft.EntityFrameworkCore.SqlServeror System.Data.SqlClient,您知道第二个是第一个的依赖项。第二个也有一些依赖性,但我认为你的问题不是来自它。

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

编辑

根据dotnet-pack 文档

打包项目的 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>
Run Code Online (Sandbox Code Playgroud)

另外,不再需要dotnet restore根据dotnet-pack 文档中的以下内容使用:

从 .NET Core 2.0 开始,您不必运行它,dotnet restore 因为它由所有需要进行还原的命令(例如dotnet builddotnet run)隐式运行。在某些进行显式恢复有意义的情况下,它仍然是有效的命令。