ASP.NET Core MVC 分层项目中Identity脚手架生成报错问题
跨双项目ASP.NET Core MVC 生成Identity脚手架报错问题处理
现有问题上下文
- 解决方案为双项目结构:
- 独立类库项目:存放模型定义、业务服务、全局配置项
- Web项目:承载控制器、视图等前端交互逻辑
- 已完成的前置操作:
- 引入整套Identity依赖NuGet包:
Microsoft.AspNetCore.Identity.EntityFrameworkCore、Microsoft.AspNetCore.Identity.UI、Microsoft.Extensions.Identity.Stores - 在类库中自定义DbContext类,先后尝试两种继承写法:
- 带泛型参数的标准写法:
public class NameDbContext : IdentityDbContext<IdentityUser> - 无泛型参数写法:
public class NameDbContext : IdentityDbContext
- 带泛型参数的标准写法:
- 已通过Package Manager Console依次执行
add-migration、update-database命令完成迁移,数据库中可正常生成整套Identity关联数据表
- 引入整套Identity依赖NuGet包:
- 异常触发场景:在Web项目中右键选择「添加」→「新建搭建基架项」,选择Identity功能项准备生成页面对应代码时,弹出报错提示,两种DbContext写法均无法解决该异常
核心报错原因
- 脚手架工具的类型扫描逻辑默认局限于当前Web项目程序集,无法自动识别类库项目中定义的DbContext类型,导致上下文校验失败
- Web项目未提前在依赖注入容器中注册Identity相关服务,脚手架预校验阶段找不到已配置的服务入口
- 类库与Web项目引用的Identity、EF Core相关NuGet包版本不统一,存在类型加载冲突
- 跨项目场景下遗漏了Web项目侧的脚手架运行基础依赖,导致工具无法正常加载类型
分步修复方案
- 确认Web项目的脚手架基础依赖
- 为Web项目安装版本匹配的
Microsoft.VisualStudio.Web.CodeGeneration.DesignNuGet包,这是Visual Studio脚手架工具正常运行的必备依赖,跨项目拆分结构下经常被遗漏
- 为Web项目安装版本匹配的
- 提前完成Web项目的Identity服务注册
- 在Web项目的
Program.cs(.NET 6+ minimal hosting模式)或Startup.cs(.NET 5及之前版本)中引入类库命名空间,完成DbContext与Identity服务的依赖注入配置,示例代码:// 引入类库的模型与DbContext命名空间 using 你的类库项目命名空间; // 注册数据库上下文,关联配置文件中的连接字符串 builder.Services.AddDbContext<NameDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 注册Identity核心服务,绑定自定义DbContext builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<NameDbContext>();
- 在Web项目的
- 统一跨项目的NuGet包版本
- 逐一比对类库项目、Web项目中所有EntityFrameworkCore、Identity相关NuGet包的版本号,确保与项目目标框架完全适配,避免不同版本间的类型加载冲突
- 正确配置脚手架生成界面的上下文关联
- 进入Identity脚手架选择界面后,勾选需要生成的页面项(登录、注册、个人信息管理等),在「数据上下文类」选择栏,不要选择自动新建的临时上下文,手动定位选择类库中定义的
NameDbContext - 如果下拉框无法自动识别到该类型,直接在输入框中填写带程序集标识的全限定类名,格式为
[类库命名空间].NameDbContext, [类库项目程序集名]
- 进入Identity脚手架选择界面后,勾选需要生成的页面项(登录、注册、个人信息管理等),在「数据上下文类」选择栏,不要选择自动新建的临时上下文,手动定位选择类库中定义的
- 清理本地工具缓存
- 关闭Visual Studio后,删除解决方案根目录下的
.vs隐藏文件夹,同时删除所有项目目录下的bin、obj编译缓存文件夹,重新打开解决方案还原NuGet包后,再次尝试脚手架生成操作
- 关闭Visual Studio后,删除解决方案根目录下的
内容的提问来源于stack exchange,提问作者user14669223
相关产品推荐
相关产品推荐

