专门针对单个 .NET Standard API/namespace (Entity Framework Core) 的旧版本

Specifically target older version of single .NET Standard API/namespace (Entity Framework Core)

我正在将我的应用程序中的 .NET Core 升级到 2.1。使用最新的 SDK (2.1.300),.NET Standard 有两个版本的 Entity Framework Core。因此,当我右键单击下面的行并单击 "Go To Definition" 时,我会在下面的屏幕截图中看到选项。

using Microsoft.EntityFrameworkCore;

注意 Entity Framework Core 的 2.1.0.0 和 2.0.3.0。我假设,默认情况下,我的目标是可用的最高版本 (2.1.0.0)。我想专门针对 2.0.3.0,因为我相信我的 class 库的 EF 数据提供程序 currently has an incompatibility 是 2.1.0.0。但是,我想继续使用最新版本的 SDK。有没有办法通过某种方式指定要使用的 Microsoft.EntityFrameworkCore 的版本号来实现这一点?

如果重要的话,我已经完成了 2.x to 2.1 migration guide。以下是我的 class 库的 .csproj 的相关部分供参考:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.3" />
  </ItemGroup>

</Project>

你似乎混淆了一些东西:

  • .NET Core SDK 主要决定了您可以使用的工具。除非你有充分的理由,否则你应该总是 运行 最新的 SDK。所以你应该使用当前版本 2.1.300 的 SDK。 SDK 版本对您将使用的运行时间没有直接影响。
  • 如果您想要 运行 .NET Core 2.1 版的 ASP.NET 核心应用程序,则必须使用 netcoreapp2.1 目标框架。
  • 显然,您必须使用 2.1 版的 Microsoft.AspNetCore.* 软件包。
  • 如果您想在版本 2.0.x 中使用 Entity Framework 核心,那么您需要明确引用它。请注意,在那种情况下,您不能使用共享框架参考Microsoft.AspNetCore.App

因此,在 .NET Core 2.1 上使用 ASP.NET Core 2.1 的项目,使用 Entity Framework 2.0 和 Pomelo MySQL 提供程序可能如下所示:

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>netcoreapp2.1</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore" Version="2.1.0" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.0" />
        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.3" />
        <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.1" />
    </ItemGroup>

</Project>

如果您不是在 ASP.NET 核心 Web 项目中而是在库项目中尝试这样做,那么您的目标是 netstandard2.0。在这种情况下,您只需要直接导入适当的包即可:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.3" />
        <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.1" />
    </ItemGroup>

</Project>

请注意 Entity Framework 核心 包含在 .NET 标准中,它只是针对它,这意味着它建立在标准之上;就像您的图书馆项目一样。

如果您想从 ASP.NET Core 2.1 应用程序中使用您的库项目,则上述限制仍然适用:您不能使用 Microsoft.AspNetCore.App 共享框架引用,因为那样会导致版本冲突。