ASP Core 3.1添加Identity时Scaffold菜单缺失Data context class
ASP.NET Core 3.1 添加Identity时Scaffold菜单缺失Data context class选项排查方案
依赖包版本与安装位置校验
- 所有EF Core、Identity、代码生成相关NuGet包必须严格对齐3.1.x稳定版本,禁止混装5.0/6.0+版本,重点核对以下包版本:
Microsoft.AspNetCore.Identity.EntityFrameworkCoreMicrosoft.AspNetCore.Identity.UIMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.DesignMicrosoft.VisualStudio.Web.CodeGeneration.Design
以上包统一使用3.1分支最高稳定版3.1.32即可。
Microsoft.VisualStudio.Web.CodeGeneration.Design必须安装在Web主项目中,不能只安装在数据访问类库中,Scaffold工具只会扫描启动项目的引用清单。
现有DbContext适配修改
你之前通过数据库反向工程生成的默认DbContext不满足Identity要求,必须做以下调整:
- 让DbContext继承自
IdentityDbContext<你的自定义用户类>,如果暂时不扩展用户字段,直接继承无用户类泛型的IdentityDbContext即可,不能保留原始继承DbContext的实现。 - 为DbContext添加接收
DbContextOptions<当前DbContext类型>参数的公共构造函数,透传给基类构造逻辑。 - 在
OnModelCreating方法重写的第一行调用base.OnModelCreating(modelBuilder),再保留你之前反向工程生成的其他业务表映射配置,避免Identity相关表结构映射被覆盖。
参考实现代码:public class AppDbContext : IdentityDbContext<AppUser> { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } // 保留之前生成的业务表DbSet public DbSet<Order> Orders { get; set; } // ...其他DbSet protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 保留之前生成的业务表FluentAPI配置 // ... } }
Startup服务注册校验
- ConfigureServices方法中服务注册顺序不能错:先注册DbContext,再注册Identity服务,最后注册Mvc/Razor Pages服务,参考配置:
public void ConfigureServices(IServiceCollection services) { // 保留原有数据库连接配置,不需要修改连接字符串 services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); // 添加Identity服务,指向自定义用户类和现有DbContext services.AddDefaultIdentity<AppUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<AppDbContext>(); services.AddControllersWithViews(); services.AddRazorPages(); // 必须添加,Identity默认依赖Razor Pages运行 } - Configure方法中,在
app.UseRouting()之后、app.UseEndpoints()之前,添加认证授权中间件:app.UseAuthentication(); app.UseAuthorization();
缓存清理与替代操作方案
- 完成以上修改后,完全关闭Visual Studio,删除项目根目录下的
.vs隐藏文件夹、bin、obj目录,重新打开解决方案等待NuGet包还原完成,再进入Scaffold菜单,等待3-5秒让工具扫描完所有程序集,Data context class下拉选项就会正常加载。 - 如果GUI菜单始终加载异常,直接绕开GUI使用命令行生成Identity页面,在包管理器控制台执行以下命令即可:
# 先确认代码生成工具包已安装 Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design -Version 3.1.32 # 生成需要的Identity页面,替换成你自己的DbContext名称和需要的页面列表 dotnet aspnet-codegenerator identity -dc AppDbContext --files "Account.Register;Account.Login;Account.Logout"
注意:如果你的数据库中已经存在自定义用户表,生成首次Identity迁移后,先检查迁移脚本,删除和现有用户表结构冲突的建表/字段修改逻辑,再执行数据库更新,避免丢失现有业务数据。
内容的提问来源于stack exchange,提问作者matthewfreestylemusiccouk
相关产品推荐
相关产品推荐

