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

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()实例化上下文(或者框架某些逻辑默认调用了无参构造),这时候无参构造创建的上下文根本没拿到配置好的数据库连接参数,自然会报错。而最初提示要加无参构造,本质就是因为代码里存在直接实例化的逻辑。

具体解决步骤:

  1. 删除WebContext中的无参构造函数
    只保留带DbContextOptions<WebContext>参数的构造函数即可,无参构造是多余的,反而会引发错误实例化。

  2. 通过依赖注入正确获取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();
              // 执行数据操作
          }
      }
      
  3. 避免直接new WebContext
    所有需要使用上下文的地方,都通过依赖注入容器获取实例,不管是直接注入上下文本身(ASP.NET Core中AddDbContextFactory也支持直接注入上下文),还是注入工厂来创建实例。

额外说明

你之前熟悉的旧方式可能是直接用AddDbContext注册上下文,然后通过构造注入使用。现在AddDbContextFactory是为多线程、后台服务等场景设计的更灵活方案,但核心逻辑没变:不能通过无参构造实例化上下文,必须让依赖注入容器提供配置好的实例。

内容的提问来源于stack exchange,提问作者user616076

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:05:18