EntityFrameworkCore 和 net48
EntityFrameworkCore and net48
我有一个 class 库,它为 EntityFrameworkCore
提供了一些可重复使用的糖,目前它的目标是 netstandard2.0;netstandard2.1
。
我有一些项目引用了这个 class 库,其中大部分以 netcore
为目标,但其中一些以 net48
.
为目标
更新对 net50
和 EFCore 5.0
的引用,我发现 EFCore 5.0
no longer supports 目标 netstandard2.0
/ net48
.
如果我希望 net48
和 net50
使用我的 class 库,我相信我必须:
- 将
Microsoft.EntityFrameworkCore
包限制为 5.0 (version=[3.1.10,5.0)
) 之前的版本,或
- 创建两个库:
- 其中一个目标
netstandard2.0
并引用 EFCore 3.1.10
- 其他目标
netstandard2.1
并引用 EFCore 5.0
有没有办法将 单个 库构建为 netstandard2.0
引用 EFCore 3.1.10
和 netstandard2.1
引用 EFCore [=26] =].
我认为这不切实际,“正确”的答案是两个不同的库。
NuGet打包为这种情况提供了解决方案。 (我需要 NuGet 201 课程!)
如果这对其他人有帮助,在我的 .csproj
中,我添加了:
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
[...]
<Choose>
<When Condition=" '$(TargetFramework)' == 'netstandard2.0'">
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.13" />
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.4" />
</ItemGroup>
</Otherwise>
</Choose>
当与 dotnet pack myproject.csproj
一起打包时,会产生:
<dependencies>
<group targetFramework=".NETStandard2.0">
<dependency id="Microsoft.EntityFrameworkCore" version="3.1.13" exclude="Build,Analyzers" />
[...]
</group>
<group targetFramework=".NETStandard2.1">
<dependency id="Microsoft.EntityFrameworkCore" version="5.0.4" exclude="Build,Analyzers" />
[...]
</group>
</dependencies>
测试使用时:
- 针对
.net48
,已安装 3.1.13
版本
- 针对
.net5.0
,已安装 5.0.4
版本
缺点:
- Visual Studio的NuGet管理器不能用于更新条件版本;您将需要手动更新这些部分。
- 测试需要有类似的条件部分
编辑:我发现创建一个管理此条件引用的“包装项目”很方便:例如我有一个 MyData
项目/NuGET 包,它是包含 EntityFramework
的代理。所有其他有条件地需要 EntityFramework
的项目,只需引用 MyData
。这使 <Choose>
仅保留在 1 个项目中,所有其他项目都可以一如既往地获取最新信息。
我有一个 class 库,它为 EntityFrameworkCore
提供了一些可重复使用的糖,目前它的目标是 netstandard2.0;netstandard2.1
。
我有一些项目引用了这个 class 库,其中大部分以 netcore
为目标,但其中一些以 net48
.
更新对 net50
和 EFCore 5.0
的引用,我发现 EFCore 5.0
no longer supports 目标 netstandard2.0
/ net48
.
如果我希望 net48
和 net50
使用我的 class 库,我相信我必须:
- 将
Microsoft.EntityFrameworkCore
包限制为 5.0 (version=[3.1.10,5.0)
) 之前的版本,或 - 创建两个库:
- 其中一个目标
netstandard2.0
并引用 EFCore3.1.10
- 其他目标
netstandard2.1
并引用 EFCore5.0
- 其中一个目标
有没有办法将 单个 库构建为 netstandard2.0
引用 EFCore 3.1.10
和 netstandard2.1
引用 EFCore [=26] =].
我认为这不切实际,“正确”的答案是两个不同的库。
NuGet打包为这种情况提供了解决方案。 (我需要 NuGet 201 课程!)
如果这对其他人有帮助,在我的 .csproj
中,我添加了:
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
[...]
<Choose>
<When Condition=" '$(TargetFramework)' == 'netstandard2.0'">
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.13" />
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.4" />
</ItemGroup>
</Otherwise>
</Choose>
当与 dotnet pack myproject.csproj
一起打包时,会产生:
<dependencies>
<group targetFramework=".NETStandard2.0">
<dependency id="Microsoft.EntityFrameworkCore" version="3.1.13" exclude="Build,Analyzers" />
[...]
</group>
<group targetFramework=".NETStandard2.1">
<dependency id="Microsoft.EntityFrameworkCore" version="5.0.4" exclude="Build,Analyzers" />
[...]
</group>
</dependencies>
测试使用时:
- 针对
.net48
,已安装3.1.13
版本 - 针对
.net5.0
,已安装5.0.4
版本
缺点:
- Visual Studio的NuGet管理器不能用于更新条件版本;您将需要手动更新这些部分。
- 测试需要有类似的条件部分
编辑:我发现创建一个管理此条件引用的“包装项目”很方便:例如我有一个 MyData
项目/NuGET 包,它是包含 EntityFramework
的代理。所有其他有条件地需要 EntityFramework
的项目,只需引用 MyData
。这使 <Choose>
仅保留在 1 个项目中,所有其他项目都可以一如既往地获取最新信息。