You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC中激活ApplicationDbContext时依赖注入失败求助

ASP.NET Core MVC项目EF脚手架生成CRUD报错:无法解析DbContextOptions服务

我正在开发一个大学作业用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:02:14