首页 > 解决方案 > InvalidOperationException:没有为此 DbContext 配置数据库提供程序。可以通过覆盖 DbContext 来配置提供程序

问题描述

我正在处理没有存储库模式的项目。我试图将我的业务逻辑与控制器分开,有点像设置业务层。我执行以下操作来获取我的所有用户。

数据库上下文

public class DatabaseContext : DbContext
{
    public DatabaseContext() : base() { }
    public DatabaseContext(DbContextOptions options) : base(options) { }
    public DbSet<User> Users { get; set; }
    public DbSet<OvertimeRequest> OvertimeRequests { get; set; }
    public DbSet<HolidayRequest> HolidayRequests { get; set; }
    public DbSet<PaymentRequest> PaymentRequests { get; set; }
}

加班申请业务

public class OvertimeRequestBusiness
{
    public static OvertimeRequestBusiness Instance { get; } = new 
        OvertimeRequestBusiness();

    public OvertimeRequestBusiness() { }

    public async Task<List<User>> GetAllUsersAsync()
    {
        using (var ctx = new DatabaseContext())
        {
            var query = ctx.Users;
            var res = await query.ToListAsync();
            return res;
        }
    }
}

控制器

[Route("users"), HttpGet]
public async Task<List<User>> GetAllUsers()
{
    return await OvertimeRequestBusiness.Instance.GetAllUsersAsync();
}

我得到的错误是

InvalidOperationException:没有为此 DbContext 配置数据库提供程序。可以通过覆盖 DbContext.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用 AddDbContext,则还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions<TContext> 对象并将其传递给 DbContext 的基本构造函数**

标签: c#entity-frameworkasp.net-coredbcontext

解决方案


在不更改的情况下,在类的方法中OvertimeRequestBusiness设置数据库连接字符串:OnCongfiguringDbContext

  1. 在 `appsettings.json 中设置连接字符串:

    "ConnectionStrings": {
        "MyConnectionString": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-1234;Trusted_Connection=True;MultipleActiveResultSets=true"
    },
    
  2. 创建Setting.cs

    public class Setting
    {
        public static string ConnectionString { get; set; }
    }
    
  3. 配置连接字符串Startup.cs

    Setting.ConnectionString = Configuration.GetSection("ConnectionStrings:MyConnectionString").Value;
    
  4. 修改DatabaseContext

    public class DatabaseContext : DbContext
    {
    
          public DbSet<User> Users { get; set; }
          public DbSet<OvertimeRequest> OvertimeRequests { get; set; }
          public DbSet<HolidayRequest> HolidayRequests { get; set; }
          public DbSet<PaymentRequest> PaymentRequests { get; set; }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(Setting.ConnectionString);
            }
        }
    
    }
    

但常见的方法是使用 DbContext 和依赖注入:

https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext


推荐阅读