.NET 6 激活StudentController时无法解析DB_Context服务如何解决?
报错原因说明
- 第一个报错 InvalidOperationException: Unable to resolve service for type 'mvc_net6.Service.DB_Context' 是因为你没有将自定义的
DB_Context注册到ASP.NET Core依赖注入容器中,控制器构造函数注入时找不到对应服务。 - 第二个报错 System.InvalidOperationException: Cannot modify ServiceCollection after application is built 是因为你将
AddDbContext服务注册代码写在了builder.Build()之后,调用Build()方法后服务容器已经构建完成,不允许再修改服务集合,同时你还重复编写了中间件配置、app.Run()代码,执行逻辑完全混乱。
修复步骤
1. 调整Program.cs代码逻辑
ASP.NET Core的执行顺序要求:先注册所有服务,再构建应用,最后配置中间件启动应用,修改后的Program.cs代码如下:
using Microsoft.EntityFrameworkCore; using mvc_net6.Service; using MySqlConnector; var builder = WebApplication.CreateBuilder(args); // 所有服务注册必须放在builder.Build()之前 // 读取配置中的数据库连接字符串 var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); // 适配你的MariaDB版本,也可使用ServerVersion.AutoDetect(connectionString)自动识别版本 var serverVersion = new MariaDbServerVersion(new Version(10, 5, 12)); // 注册DB_Context服务 builder.Services.AddDbContext<DB_Context>(opt => { opt.UseMySql(connectionString, serverVersion); }); // Add services to the container. builder.Services.AddControllersWithViews(); // 服务全部注册完成后再构建应用 var app = builder.Build(); // 配置中间件管道 if (!app.Environment.IsDevelopment()) { 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.Run() app.Run();
2. 配置数据库连接字符串
打开项目根目录的appsettings.json,添加数据库连接配置,替换为你自己的数据库信息:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "DefaultConnection": "server=127.0.0.1;port=3306;database=你的数据库名;user=数据库用户名;password=数据库密码;CharSet=utf8mb4;" } }
修改完成后重新运行项目即可解决两个报错。
内容的提问来源于stack exchange,提问作者r31sr4r
相关产品推荐
相关产品推荐

