ASP.NET Core MVC从SQL Server取数到视图时配置报错求助
我已许久未做SQL Server数据库数据传递至视图的操作,现在相关实现变化不少。我开发新应用时完成了以下配置:
1. 定义模型
public class LoginModel { public string UserId { get; set; } = null!; public string Username { get; set; } = null!; public string Password { get; set; } = null! ; public short UserType { get; set; } }
2. 配置DbContext
public class WebContext : DbContext { public WebContext(DbContextOptions<WebContext> options) : base(options) { } public virtual DbSet<LoginModel>? Login { get; set; } }
3. 更新Program.cs
builder.Services.AddDbContextFactory<WebContext>( opt => opt.UseSqlServer( builder.Configuration.GetConnectionString("WebConn")));
4. 更新appsettings.json
"ConnectionStrings": { "WebConn": "Data Source=LAPTOP-4LUQ899E;Initial Catalog=BookSearch;TrustServerCertificate=Yes;Trusted_Connection=True" },
本以为能正常访问数据传去视图,结果运行时提示要加无参构造函数,我加了:
public WebContext() { }
之后又报错:
No database provider has been configured for this DbContext. A provider can be configured by overriding the 'DbContext.OnConfiguring' method or by using 'AddDbContext' on the application service provider
过去这类操作很简单,请问我哪里配置错了?
核心问题:混用了AddDbContextFactory注册与直接实例化DbContext的方式
你用AddDbContextFactory注册了上下文工厂,但代码里可能直接通过new WebContext()实例化上下文(或者框架某些逻辑默认调用了无参构造),这时候无参构造创建的上下文根本没拿到配置好的数据库连接参数,自然会报错。而最初提示要加无参构造,本质就是因为代码里存在直接实例化的逻辑。
具体解决步骤:
删除WebContext中的无参构造函数
只保留带DbContextOptions<WebContext>参数的构造函数即可,无参构造是多余的,反而会引发错误实例化。通过依赖注入正确获取WebContext
- 控制器场景直接构造注入:
public class LoginController : Controller { private readonly WebContext _dbContext; public LoginController(WebContext dbContext) { _dbContext = dbContext; } public IActionResult Index() { var loginData = _dbContext.Login?.ToList(); return View(loginData); } } - 后台任务/多线程场景用工厂创建:
public class DataSyncService { private readonly IDbContextFactory<WebContext> _contextFactory; public DataSyncService(IDbContextFactory<WebContext> contextFactory) { _contextFactory = contextFactory; } public void SyncData() { using var dbContext = _contextFactory.CreateDbContext(); // 执行数据操作 } }
- 控制器场景直接构造注入:
避免直接new WebContext
所有需要使用上下文的地方,都通过依赖注入容器获取实例,不管是直接注入上下文本身(ASP.NET Core中AddDbContextFactory也支持直接注入上下文),还是注入工厂来创建实例。
额外说明
你之前熟悉的旧方式可能是直接用AddDbContext注册上下文,然后通过构造注入使用。现在AddDbContextFactory是为多线程、后台服务等场景设计的更灵活方案,但核心逻辑没变:不能通过无参构造实例化上下文,必须让依赖注入容器提供配置好的实例。
内容的提问来源于stack exchange,提问作者user616076

