InvalidOperationException:尚未为此DbContext配置任何数据库提供程序。可以通过覆盖DbContext来配置提供程序

问题描述 投票:0回答:3

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

的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; }
}

OvertimeRequestBusiness

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-framework asp.net-core dbcontext
3个回答
1
投票

不改变OvertimeRequestBusiness就是在OnCongfiguring类的DbContext方法中设置db连接字符串:

  1. 在`appsettings.json中设置连接字符串: "ConnectionStrings": { "MyConnectionString": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-1234;Trusted_Connection=True;MultipleActiveResultSets=true" },
  2. 创建Setting.cspublic class Setting { public static string ConnectionString { get; set; } }
  3. 在qazxsw poi中配置连接字符串: qazxsw poi
  4. 修改Startup.csSetting.ConnectionString = Configuration.GetSection("ConnectionStrings:MyConnectionString").Value;

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

DatabaseContext


0
投票

你的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); } } } 构造函数需要指向连接字符串。

改变它

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

您的连接字符串位于web.config中

DatabaseContext

0
投票

我删除了DbContext的默认无参数构造函数,然后在OvertimeRequestBusiness中传递了DbContextBuilderOption作为参数。这对我有用。

OvertimeRequestBusiness现在看起来像这样

public class DatabaseContext : DbContext
{
    // Tell DbContext to look for the "MyConnectionString" in .config.
    public DatabaseContext() : base("MyConnectionString") { }

    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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.