首页
/ EntityFramework Core 9.0 设计包加载问题解析与解决方案

EntityFramework Core 9.0 设计包加载问题解析与解决方案

2025-05-15 01:22:28作者:吴年前Myrtle

问题背景

在.NET 9.0环境下使用EntityFramework Core进行Blazor应用开发时,开发者在执行脚手架命令生成CRUD页面时遇到了一个常见错误。错误信息表明系统无法加载Microsoft.EntityFrameworkCore.Design程序集,版本号为9.0.0.0。

错误现象

当开发者运行以下脚手架命令时:

dotnet aspnet-codegenerator blazor CRUD \
    -dbProvider sqlite \
    -dc BlazorWebAppMovies.Data.BlazorWebAppMoviesContext \
    -m Movie \
    -outDir Components/Pages

系统会抛出如下错误:

Could not load file or assembly 'Microsoft.EntityFrameworkCore.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.

问题根源

这个问题源于.NET SDK 9.0.200版本中的一个破坏性变更。在默认情况下,Microsoft.EntityFrameworkCore.Design包被标记为仅用于开发工具,不会在运行时加载。然而,脚手架工具在运行时需要访问这个程序集来执行代码生成操作。

解决方案

推荐解决方案

在项目文件中修改Microsoft.EntityFrameworkCore.Design包的引用方式,添加Publish属性:

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.2">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  <Publish>true</Publish>
</PackageReference>

替代方案

  1. 完全移除特殊标记: 可以完全移除PrivateAssets和IncludeAssets标记,将包作为普通依赖引用:
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.2" />
  1. 使用环境变量: 设置DOTNET_ROLL_FORWARD环境变量:
export DOTNET_ROLL_FORWARD=Major

技术原理

Microsoft.EntityFrameworkCore.Design包通常只用于开发工具,不应该包含在最终发布的应用程序中。因此,默认情况下它被标记为PrivateAssets=all,这意味着它不会被发布或传递给依赖项目。

然而,在脚手架过程中,代码生成器需要在运行时动态加载这个程序集来分析实体模型和DbContext。当.NET SDK 9.0.200版本加强了包隔离策略后,这种动态加载就失败了。

长期展望

这个问题是.NET SDK 9.0.200版本引入的一个临时性问题,将在后续版本中得到修复。届时开发者可以恢复使用标准的包引用方式。

最佳实践建议

  1. 对于生产项目,建议采用推荐的解决方案,明确指定Publish=true,这样既能满足脚手架需求,又能保持包的开发工具属性。
  2. 定期检查.NET SDK更新,当问题修复后可以移除这些临时解决方案。
  3. 在团队开发环境中,确保所有开发者使用相同的解决方案,避免因环境差异导致的不一致问题。

通过以上分析和解决方案,开发者可以顺利地在.NET 9.0环境下继续使用EntityFramework Core的脚手架功能,而不会受到这个临时性问题的困扰。

登录后查看全文
热门项目推荐
相关项目推荐