ASP.NET Core MVC中激活ApplicationDbContext时依赖注入失败求助
我正在开发一个大学作业用的ASP.NET Core MVC小型项目,在类库项目中定义了自定义的ApplicationDbContext类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using WebLabsV04.DAL.Entities; namespace WebLabsV04.DAL.Data { public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<Dish> Dishes { get; set; } public DbSet<DishGroup> DishGroups { get; set; } } }
尝试用Entity Framework生成CRUD Razor Page脚手架时,一直遇到以下错误:
Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[WebLabsV04.DAL.Data.ApplicationDbContext]' while attempting to activate 'WebLabsV04.DAL.Data.ApplicationDbContext'.
我已经尝试注册ApplicationDbContext服务,但问题依旧。以下是我的Program.cs代码:
using Laba1; using Laba1.Services; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using System.Configuration; using WebLabsV04.DAL.Data; using WebLabsV04.DAL.Entities; var builder = WebApplication.CreateBuilder(args); // Add services to the container. var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found."); builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); builder.Services.AddControllersWithViews(); builder.Services.AddIdentityCore<ApplicationUser>(options => { options.SignIn.RequireConfirmedAccount = false; options.Password.RequireLowercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequireDigit = false; }) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders() .AddSignInManager<SignInManager<ApplicationUser>>(); builder.Services.ConfigureApplicationCookie(options => { options.LoginPath = $"/Identity/Account/Login"; options.LogoutPath = $"/Identity/Account/Logout"; }); var app = builder.Build(); var scope = app.Services.CreateScope(); var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); var userManager = scope.ServiceProvider.GetRequiredService<UserManager<ApplicationUser>>(); var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>(); DbInitializer.Seed(context, userManager, roleManager) .GetAwaiter() .GetResult(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); app.Run();
问题原因及解决办法
1. 身份服务注册冲突
你同时注册了AddDefaultIdentity<IdentityUser>和AddIdentityCore<ApplicationUser>,这会导致服务容器中身份相关服务混乱,进而干扰ApplicationDbContext的解析。
解决:
删除AddDefaultIdentity<IdentityUser>的注册代码,保留自定义的ApplicationUser身份服务,并补充AddDefaultUI()以确保Identity Razor Pages正常工作:
// 移除冲突的默认身份服务注册 // builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) // .AddEntityFrameworkStores<ApplicationDbContext>(); // 保留并完善自定义身份服务 builder.Services.AddIdentityCore<ApplicationUser>(options => { options.SignIn.RequireConfirmedAccount = false; options.Password.RequireLowercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequireDigit = false; }) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders() .AddSignInManager<SignInManager<ApplicationUser>>() .AddDefaultUI(); // 添加此行,保障Identity页面功能
2. 脚手架工具的上下文识别问题
如果修改后仍报错,可能是脚手架工具无法正确识别类库中的ApplicationDbContext,可尝试:
- 确认类库项目已被主Web项目引用;
- 在Package Manager Console中切换到Web项目,明确指定上下文执行脚手架命令:
Scaffold-DbContext "你的连接字符串" Microsoft.EntityFrameworkCore.SqlServer -Context ApplicationDbContext -OutputDir Models -Force - 执行脚手架操作时,手动选择正确的项目和
ApplicationDbContext类。
3. 验证连接字符串配置
确保appsettings.json中存在正确的DefaultConnection连接字符串:
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=WebLabsV04;Trusted_Connection=True;MultipleActiveResultSets=true" } }
内容的提问来源于stack exchange,提问作者casplaer

