同时针对 ef core 3.1 和 5 是个好主意吗?

Posted

技术标签:

【中文标题】同时针对 ef core 3.1 和 5 是个好主意吗?【英文标题】:Is it a good idea to target both ef core 3.1 and 5? 【发布时间】:2021-06-12 14:08:52 【问题描述】:

我有一个小型 nuget 包,它与一个带有 2 个表的小型数据库交互。我在 2 个项目中使用过它,1 是 dotnet 5,另一个是旧的 dotnet 框架 4.6,因此我的目标是 netstandard2.0,到目前为止它运行良好。

我需要将 dotnet 5 中的所有软件包更新到最新版本,但 ef core 5 需要 dotnet 标准 2.1。最好的处理方法是什么?

我考虑过多目标,但首先我不知道这是否是个好主意,然后我不知道如何用 ef 5 和 dotnet standard 2 来定位 dotnet standard 2.1使用 ef 3.1。

【问题讨论】:

imo,针对两者都很好。更少的维护工作,集中的代码。只需要一些#if NET5 或类似的smt 来保持差异(如果有的话)。您可以编写一个 shell 脚本来同时为两个版本构建和发布到 nuget like this 我为 AspNetCore 2.1 和 2.2 发布了这个项目。所以任何项目 2.1 都可以使用 nuget 2.1 包等等 【参考方案1】:

针对多个版本的 EF Core(或任何其他包)可以,但请记住,它会影响包的可维护性,因此只有您可以决定是否值得。

您是否将从 EF Core 5 的任何特定功能/性能改进中受益? 您和您的用户是否可以接受不同的行为?如果没有,请重新审视上一点,因为您可能需要调整代码以实现这一点,忽略一些 EF Core 5 附加组件。 等

关于实施:

您可以通过在ItemGroup 级别使用Condition 并检查$(TargetFramework) 的值来解决项目引用问题。

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.13" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' != 'netstandard2.0' ">
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.4" />
</ItemGroup>

在您的 C# 代码中,您需要使用预处理器指令 (#if NETSTANDARD2_0) 来区分这两种实现。

您可以阅读有关 .csproj 和 C# 解决方案here 的更详细文档。

【讨论】:

以上是关于同时针对 ef core 3.1 和 5 是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 中动态编辑 .env 是个好主意吗?

同时读取多个文件是个好主意吗?

包含在FromSqlRaw和EF Core 3.1中的存储过程中

3.1 ef core

EF Core 3.1 (LINQ) - 如何在多列上左加入和分组

由于产生时间成本,禁用 EF Core 3.1 的模型验证