.NET Core 3.0预览版Blazor托管项目添加EF Core驱动构建报错
我之前也碰到过一模一样的问题,这个错误是Blazor的代码裁剪工具(ILLink)处理EF Core程序集时引发的,结合你的场景,原因和解决方法如下:
问题根源
- ILLink裁剪逻辑冲突:Blazor WebAssembly项目会自动用ILLink裁剪未使用的代码来缩小包体积,但EF Core大量依赖反射、动态类型生成,ILLink无法识别这些动态引用,误删了必要的代码,导致处理程序集时崩溃(退出代码
-532462766就是这个场景的典型错误)。 - 架构设计不合理:Shared项目是Client和Server共享的,而Client是WebAssembly环境,本身不支持直接运行EF Core(没法直接连接数据库,也缺少对应的运行时组件),所以EF Core的依赖根本不应该出现在Shared项目里。
正确解决步骤
1. 移除Shared项目中的EF Core依赖
右键点击你的Blazor10.Shared项目 → 选择「管理NuGet程序包」,卸载所有EF Core相关的包(包括Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Relational等)。
2. 将EF Core依赖迁移到Server项目
右键点击Blazor10.Server项目 → 「管理NuGet程序包」,安装你需要的EF Core包(建议使用和.NET Core 3.0 Preview4匹配的EF Core预览版本,比如3.0-preview4,避免跨版本依赖冲突)。
3. 调整项目结构
- 把
DbContext类以及所有和数据库访问相关的代码从Shared项目移到Server项目中 - Shared项目只保留实体类、DTO、业务接口等不需要EF依赖的通用代码
(可选)特殊场景的兼容处理(不推荐)
如果确实有特殊需求必须在Shared项目中保留EF相关类型(比如实体配置类),你可以通过配置ILLink来禁止裁剪EF的程序集:
- 在
Blazor10.Client项目中新建一个linker.xml文件 - 将文件的「生成操作」设置为「嵌入的资源」
- 写入以下配置:
<linker> <assembly fullname="Microsoft.EntityFrameworkCore" preserve="all" /> <assembly fullname="Microsoft.EntityFrameworkCore.Relational" preserve="all" /> <assembly fullname="Microsoft.EntityFrameworkCore.SqlServer" preserve="all" /> </linker>
但还是强烈建议遵循Blazor Hosted的架构设计,让Server负责数据访问,Shared只做通用模型共享,这样能避免很多不必要的问题。
内容的提问来源于stack exchange,提问作者Walad100100
相关产品推荐
相关产品推荐

