为什么我在 ASP.NET Core 7 中出现数据库提供程序错误?

Why do I get database provider error in ASP.NET Core 7?

提问人:sadegh 提问时间:10/22/2023 最后编辑:marc_ssadegh 更新时间:10/23/2023 访问量:56

问:

我有一个 ASP.NET Core 7 MVC项目。我想将我的 SQL Server 连接字符串放在文件中,然后在整个项目和层中使用它。appsettings.json

但是我收到提供程序错误:

System.InvalidOperationException:“尚未为此 DbContext 配置任何数据库提供程序。可以通过重写“DbContext.OnConfiguring”方法或在应用程序服务提供程序上使用“AddDbContext”来配置提供程序。如果使用“AddDbContext”,则还要确保 DbContext 类型在其构造函数中接受 DbContextOptions 对象,并将其传递给 DbContext 的基构造函数。

我该如何解决这个问题?

这是我的:appsettings.json

"ConnectionStrings": {
    "CON1": "data source=DESKTOP-JU6B74d\\SQL2019;initial catalog = Laser; integrated security = true;TrustServerCertificate=True;"
},

这是文件设置:programDbContext

builder.Services.AddControllersWithViews();

builder.Services.AddDbContext<DB>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("CON1")));

这是我在数据访问层的一部分:DbContext

public class DB : IdentityDbContext
{
    public DB() : base() { }

    public DB(DbContextOptions<DB> options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder OptionsBuilder)
    {
        OptionsBuilder.UseSqlServer(@"data source=DESKTOP-JU6B74d\SQL2019;initial catalog = Laser; integrated security = true;TrustServerCertificate=True;");
        base.OnConfiguring(OptionsBuilder);
    }
}

当我使用它时,我没有收到提供程序错误,程序可以正常工作。但在这种形式下,我也应该在文件中重复我的连接字符串。DbContextDbContext

因此,当我注释掉

protected override void OnConfiguring

方法,我收到提供程序错误。如何解决此问题并且仅从文件中读取连接字符串 - 以及为什么会出现此问题?appsettings.json

ASP.Net-Core 标识 DBCrient 提供程序

评论

0赞 Dai 10/22/2023
删除 的无参数构造函数。DB
0赞 sadegh 10/22/2023
当我删除它时,我收到错误:“严重性代码描述项目文件行抑制状态错误 CS7036 没有给出与”DB“的必需参数”options“相对应的参数。DB(DbContextOptions<DB>)' DataAcessLayer C:\Users\sadegh\source\repos\SAED\DataAcessLayer\DALContents.cs 19 Active “我也想要删除覆盖方法。因此,我只能从 AppSetting 文件中读取连接字符串。
0赞 Poul Bak 10/22/2023
这回答了你的问题吗?SignInManager.PasswordSignInAsync 上的“未为此 DbContext 配置任何数据库提供程序”
0赞 sadegh 10/22/2023
在创建我的问题之前,我阅读了这篇文章。并且不适合我。就在我写这个答案之前,我找到了一个解决方案。但我现在不知道这是否正确。 正确地删除了无参数构造函数。还要删除 override 方法。现在,我所有连接到数据库的方法都需要 DbContextOptions 作为参数。因此,我也注入了我所有的控制器、组件、层以及整个项目,这些都显示错误。现在修复了问题,连接字符串仅从 AppSetting 读取。如果这个解决方案是正确的,或者我们也可以使用更好的方法?
0赞 sadegh 10/22/2023
而且据我所知,刺痛是区分大小写的。但是现在当我将程序文件中的连接字符串名称更改为 coN1(appsetting 中的名称是 CON1)时。该程序仍然有效,不再区分大小写。

答:

1赞 Qing Guo 10/23/2023 #1

您可以参考检查生成的数据库上下文类和注册来创建数据库上下文类和注册

数据库上下文类:

public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }
    }

构造函数使用依赖项注入将数据库上下文 (MvcMovieContext) 注入控制器:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }
}

此外,配置键不区分大小写。例如,ConnectionString 和 connectionstring 被视为等效键。您可以查看配置键和值以了解更多信息。

评论

1赞 sadegh 10/23/2023
谢谢。所以我只需要在我的所有控制器中注入它。
0赞 Qing Guo 10/23/2023
@sadegh,不客气:)。你是对的。