Blazor集成ASP.NET Identity生成两个DbContext迁移报错解决方法
问题成因
使用「个人账号认证」模式创建Blazor Server项目时出现两个DbContext是脚手架生成逻辑导致的冗余:项目初始模板会在Data/路径下生成ApplicationDbContext.cs作为默认数据上下文,后续如果触发Identity Razor页面自动生成、手动搭建Identity区域脚手架,工具会额外在Areas/Identity/Data/路径下生成独立的AppDbContext.cs,同时自动在配置文件追加对应连接字符串,不属于代码逻辑错误。
冗余项清理方案
- 保留对象:根目录
Data/ApplicationDbContext.cs
这个上下文是项目模板默认生成的,本身已经继承IdentityDbContext,内置了Identity用户、角色、声明、令牌等全套认证相关的实体映射,Program.cs中默认的Identity服务、数据库上下文服务也是绑定该实例,后续直接在这个类里追加自己业务实体的DbSet即可,不需要额外修改服务注册逻辑。 - 待删除冗余项:
- 整个
Areas/Identity/Data/AppDbContext.cs文件:删除前先检查类内是否有你之前误写入的业务实体DbSet或自定义模型配置,有的话先迁移到ApplicationDbContext中再删除 appsettings.json中名为AppDbContextConnection的连接字符串节点- Program.cs中所有针对
AppDbContext的服务注册代码(如果有的话)
- 整个
配置校验
清理完成后打开Program.cs,确认数据库上下文与Identity服务的注册代码如下,确保认证模块使用的是保留的ApplicationDbContext:
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); // 注册业务上下文 builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString)); // 绑定Identity到业务上下文 builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>();
多上下文迁移报错解决
出现More than one DbContext was found. Specify which one to use报错是因为EF Core工具扫描到程序集中存在两个DbContext类型,分两种情况处理:
- 未完成冗余清理前,可通过参数指定上下文临时执行迁移:
# 包管理器控制台(PMC)命令 Add-Migration InitialCreate -Context ApplicationDbContext Update-Database -Context ApplicationDbContext # .NET CLI 命令 dotnet ef migrations add InitialCreate --context ApplicationDbContext dotnet ef database update --context ApplicationDbContext - 完成上述冗余清理、重新生成项目后,EF工具只会扫描到一个DbContext,执行普通迁移命令就不会再触发该报错。
注意:如果之前已经基于
AppDbContext生成过迁移文件或初始化过数据库,需要同步删除Migrations文件夹下关联AppDbContext的迁移历史文件,避免后续迁移版本冲突。
内容的提问来源于stack exchange,提问作者hyden97
相关产品推荐
相关产品推荐

