【问题标题】:Getting "System.Data.SqlClient is not supported on this platform" when launched as dotnet cli tool作为 dotnet cli 工具启动时获取“此平台不支持 System.Data.SqlClient”
【发布时间】:2019-10-08 22:09:13
【问题描述】:

我们有一个使用来自Microsoft.EntityFrameworkCoreDbContext 的简单netcore 2.2 控制台应用程序。从控制台按原样启动时,它按预期工作。

但是我们决定将其用作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

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

System.Data.SqlClient is not supported on this platform

确实存在将其作为 dotnet CLI 工具启动的问题。然而,我们未能得到这个问题是什么以及如何解决它。在网络上搜索并没有给我们任何尝试的想法。

【问题讨论】:

  • 打包前代码运行正常吗?即,如果您在源目录中运行 dotnet run 或在 IDE 中点击运行
  • 在这篇文章的开头我写道:“当从控制台启动时,它按预期工作。”
  • 啊,是的。道歉
  • 在SqlServer旁边添加整个entityfw的引用解决了什么? &lt;PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" /&gt;
  • @Legion,不幸的是它没有。

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


【解决方案1】:

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

dotnet dbupdate --fx-version 2.2.4

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

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

【讨论】:

  • @horgh 有没有机会你可以将复制品上传到 GitHub 以便我们从那里查看?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,这是因为使用了错误版本的 System.Data.SqlClient,在我的情况下,应用程序是使用 .NET 4.6 和 .Net Standard 2.0 中的类库构建的,它有一个依赖于 System.Data.SqlClient。 在生产环境中替换适当版本的 System.Data.SqlClient(在我的情况下为 .NET 4.6)后问题得到解决。

    【讨论】:

      【解决方案4】:

      如果您想在 Linux 操作系统上运行它,只需确保使用正确的目标运行时发布您的解决方案。例如,如果您想在 Red Hat Enterprise Linux 上运行它,请选择 linux-x64。

      【讨论】:

        【解决方案5】:

        请注意,ToList() 方法会触发 SQL 命令,例如,他第一次使用相应的 DLL。因此,您的错误只是说Microsoft.EntityFrameworkCore.SqlServerSystem.Data.SqlClient 存在依赖项不匹配,您知道第二个第一个 的依赖项。 第二个也有一些依赖关系,但我认为你的问题不是来自它。

        打包后检查默认引用(版本)并尝试更改为合适的。很遗憾,我们无法重现您的问题,因此请尝试此解决方案并告诉我们结果。

        编辑

        根据dotnet-pack documentation

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

        默认情况下,Web 项目不可打包。覆盖默认值 行为,添加&lt;IsPackable&gt;true&lt;/IsPackable&gt; 属性(在 &lt;PropertyGroup&gt;) 到您的 .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 builddotnet run,需要进行还原。它仍然是有效的 在某些情况下执行显式还原的命令 感觉。

        【讨论】:

        • 能否请您详细描述一下我们如何在打包后检查默认引用?
        • @horgh 检查github.com/dotnet/corefx/issues/34580 中的有用指南,例如dotnet --info 命令和其他一些指南。我相信不匹配。
        • 您引用的线程正在讨论在不同服务器上启动应用程序的问题。但是在我的情况下,问题出在同一台机器上。我在一台机器上编译和运行应用程序没有任何问题,在这台机器上将应用程序作为 dotnet cli 工具启动时遇到了这个问题。
        • @horgh 我知道,我的意思是打包离开您的视线后的参考更改。请注意,.net 可能会从他喜欢的任何地方获取引用,而不是您想要的地方,或者第一次解决的地方,除非您在使用 本地复制 或更改配置等方式打包之前断言。因此,唯一的方法是再次为成功的dotnet 命令指向正确的引用。
        • 那么您能否告诉我在打包之前明确指定必要包的正确方法,以便在 dotnet pack 之后不会覆盖它们?
        【解决方案6】:

        如果你用Asp.net core 2.2开发项目要注意以下问题

        当您更改目标项目设置(启动设置为 cli)或类型(将类库更改为标准库)或从 nuget 部分删除一些缺陷时,编译器无法将 dll 文件移动到目标文件夹。 (编译器错误和微软在 vs 2019 last 2 revision 中更正了此问题)您可以尝试手动移动它,但不能保证。在这种情况下,降级可能是一种结果。

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

        以上解决方案

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

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

        如果不同意请写评论

        【讨论】:

          猜你喜欢
          • 2018-08-27
          • 2019-12-29
          • 2021-01-05
          • 2019-05-25
          • 1970-01-01
          • 2017-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多