.NET Core MVC脚手架(Scaffolding)无法识别DB First生成的数据库上下文
.NET Core MVC DB First模式下Identity基架无法识别已有上下文的解决方案
核心原因
Identity基架工具仅能识别满足以下3个条件的数据库上下文,DB First默认生成的EntityDBContext不满足要求所以无法被识别:
- 必须继承
IdentityDbContext泛型基类(而非默认的DbContext) - 必须包含接收
DbContextOptions<EntityDBContext>参数的公开构造函数 - 必须已在项目的依赖注入容器中完成注册
具体修复步骤
步骤1:修正数据库上下文继承关系
- 为项目安装
Microsoft.AspNetCore.Identity.EntityFrameworkCoreNuGet包 - 修改
Data/EntityDBContext.cs的继承逻辑:
// 引用必要命名空间 using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; // 把原来继承DbContext改为继承IdentityDbContext,泛型参数可替换为自定义的用户类 public partial class EntityDBContext : IdentityDbContext<IdentityUser> { // 保留Scaffold生成的其他代码,新增适配基架的构造函数 public EntityDBContext(DbContextOptions<EntityDBContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 必须调用基类的OnModelCreating,完成Identity表的默认配置 base.OnModelCreating(modelBuilder); // 保留Scaffold生成的其他表配置逻辑 } }
注意:如果你的数据库中Identity表主键为非默认的
string类型,或自定义了用户/角色实体,需要对应调整IdentityDbContext的泛型参数,和数据库中表的字段规则匹配。
步骤2:在Program.cs中注册上下文与Identity服务
在项目启动配置文件中添加以下注册逻辑:
var builder = WebApplication.CreateBuilder(args); // 注册你的数据库上下文 builder.Services.AddDbContext<EntityDBContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 注册Identity服务,指定使用你的上下文作为存储 builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<EntityDBContext>(); // 保留你原有的其他服务注册逻辑 // ... var app = builder.Build(); // 中间件配置部分要确保按顺序加了Identity相关中间件 app.UseAuthentication(); app.UseAuthorization(); // 保留原有中间件配置 // ... app.Run();
注意要在
appsettings.json中添加对应的连接字符串配置,键名和你读取的保持一致即可。
步骤3:重新编译项目后重试基架操作
完成以上修改后先对项目执行全量编译,再重新进入「新建基架项 > Identity」流程,就能正常识别到EntityDBContext了。
内容的提问来源于stack exchange,提问作者Iago Marcello de Brito
相关产品推荐
相关产品推荐

