Asp.net core mvc 当一切正常时,如何修复无数据库提供程序的错误

Asp.net core mvc 当一切正常时,如何修复无数据库提供程序的错误,asp.net-core-mvc,entity-framework-core,Asp.net Core Mvc,Entity Framework Core,当我想将新对象插入数据库时,出现以下错误: 没有为此DbContext配置数据库提供程序 服务: private IConfiguration config; public Startup(IConfiguration config) => this.config = config; public void ConfigureServices(IServiceCollection services) { services.AddEntityFrameworkSql

当我想将新对象插入数据库时,出现以下错误:

没有为此DbContext配置数据库提供程序

服务:

private IConfiguration config;
public Startup(IConfiguration config) => this.config = config;

public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFrameworkSqlServer().AddDbContext<DataContext>(options => options.UseSqlServer(config["ConnectionStrings:MainConnection"]));

        services.AddMvc();
    }
私有IConfiguration配置;
公共启动(IConfiguration config)=>this.config=config;
public void配置服务(IServiceCollection服务)
{
services.AddEntityFrameworkSqlServer().AddDbContext(options=>options.UseSqlServer(config[“ConnectionStrings:MainConnection”]);
services.AddMvc();
}
数据上下文:

 public class DataContext:DbContext
{
    public DataContext() { }
    public DataContext(DbContextOptions<DataContext> options) : base(options) { }
    public DbSet<Request> Request { get; set; }
    public DbSet<AdminAccept> AdminAccept { get; set; }
    public DbSet<Payment> Payment { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        base.OnConfiguring(builder);
    }
}
公共类DataContext:DbContext
{
公共DataContext(){}
公共DataContext(DbContextOptions选项):基本(选项){}
公共数据库集请求{get;set;}
公共数据库集AdminAccept{get;set;}
公共数据库集支付{get;set;}
配置时受保护的覆盖无效(DbContextOptionsBuilder)
{
基础配置(建造商);
}
}
插入命令:

public async Task <int> SaveToStorageAsync()
    {

        using (DataContext context=new DataContext())
        {
            context.Request.Add(this);
            return await context.SaveChangesAsync();
        }
    }
public async Task SaveToStorageAsync()
{
使用(DataContext=newdatacontext())
{
context.Request.Add(这个);
返回wait context.SaveChangesAsync();
}
}
然而,成功地创建了迁移和数据库

我最终解决了这个问题

一切正常,但使用表达式会导致错误。(我想知道为什么)

首先,为了解决这个问题,我删除了一个using,并将一个DataContext声明为参数:

    public async Task<int> SaveToStorageAsync(DataContext context)
    {
        context.Request.Add(this);
        return await context.SaveChangesAsync();
    }
最后通过发送上下文作为参数来调用函数


跳过您在场景中使用的选项,祝您好运

,因为您向构造函数注册了
DataContext
,构造函数接收了
DbContextOptions选项
。您还需要在创建DataContext时传递该选项

var optionsBuilder = new DbContextOptionsBuilder<DataContext >();
optionsBuilder.UseSqlServer("Your connection string");

using (DataContext context = new DataContext (optionsBuilder.Options))
        {
            context.Request.Add(this);
            return await context.SaveChangesAsync();
        }
var optionsBuilder=new DbContextOptionsBuilder();
使用SQLServer(“您的连接字符串”);
使用(DataContext上下文=新的DataContext(optionsBuilder.Options))
{
context.Request.Add(这个);
返回wait context.SaveChangesAsync();
}
我建议您可以在controller中使用dbContext by DI,这是asp.net core中更推荐的方法:

public class StudentsController : Controller
{
    private readonly DataContext _context;

    public StudentsController(DataContext context)
    {
        _context = context;
    }
    public async Task <int> SaveToStorageAsync()
    {


        _context.Request.Add(this);
        return await context.SaveChangesAsync();        
    }
}
公共类学生控制器:控制器
{
私有只读数据上下文_上下文;
公共学生控制器(DataContext上下文)
{
_上下文=上下文;
}
公共异步任务SaveToStorageAsync()
{
_context.Request.Add(这个);
返回wait context.SaveChangesAsync();
}
}
这两种方式包含在以下链接中:


您是否检查了连接字符串?错误似乎表明连接字符串中的数据库提供程序无法识别。如果连接字符串错误,说明迁移系统工作正常的原因(添加或删除字段)当使用
使用
方法时,您还需要传递DbContextOptions。asp.net core中的推荐方法是依赖项注入dbcontext。您可以查看my answer.tnx中的链接以获取答案。请描述更多链接已解释清楚,您根本不需要空构造函数
public DataContext(){}
public class StudentsController : Controller
{
    private readonly DataContext _context;

    public StudentsController(DataContext context)
    {
        _context = context;
    }
    public async Task <int> SaveToStorageAsync()
    {


        _context.Request.Add(this);
        return await context.SaveChangesAsync();        
    }
}