尚未为此带有 SQL Server 的 DbContext .NET Core 配置数据库提供程序

Hun*_*pos 9 sql entity-framework asp.net-core

我一直用这个把头撞在墙上,并且一直在谷歌上搜索无济于事。

我刚刚开始一个新的 ASP.NET Core MVC 项目,我已将这两个包安装/更新为 2.2.0:

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Run Code Online (Sandbox Code Playgroud)

我已将项目设置为期望 .NET Core 2.2.0。

我能够在包管理器控制台中使用此命令成功添加表架构以构建数据库,因此我知道连接字符串正常/工作:

Scaffold-DbContext "SERVER=Server\Instance;DATABASE=Database;UID=user;PWD=password;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables Table1, Table2, Table3
Run Code Online (Sandbox Code Playgroud)

创建的模型文件DatabaseDBContext.cs如下所示:

public partial class DatabaseDBContext : DbContext
{
    public DatabaseDBContext()
    {
    }

    public DatabaseDBContext(DbContextOptions<DatabaseDBContext> options)
        : base(options)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

这还包含一种用于检索我的脚手架数据的方法,但对于生产使用来说不被认为是安全的,因此我将其注释掉:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        optionsBuilder.UseSqlServer("SERVER=Server\\Instance;DATABASE=Database;UID=user;PWD=password;");
    }
}
Run Code Online (Sandbox Code Playgroud)

我将相同的连接字符串添加到appsettings.json文件中:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "DBConnString": "SERVER=Server\\Instance;DATABASE=Database;UID=user;PWD=password;"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我将其添加DbContext到文件中startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddDbContext<DatabaseDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DBConnString")));
}
Run Code Online (Sandbox Code Playgroud)

尝试为其中一个表添加新的支架控制器会引发此错误:

正在查找生成器“控制器”...
正在运行生成器“控制器”...
正在尝试在内存中编译应用程序。
尝试找出模型和 DbContext 的 EntityFramework 元数据:“TableName”

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

StackTrace:
位于 Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProviderscopedProvider,IDbContextOptions contextOptions,DbContext context)
位于 Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
位于 Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastruct 1 工厂) 1 accessor)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func

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

有人知道我在这里做错了什么吗?

Hun*_*pos 4

所以我以一种非常迂回的方式修复了它。我的新项目最初是在旧版本的 .net core 上进行的。我已经更新了版本,但在更新过程中肯定有一些不喜欢的地方。我创建了一个新项目并在 2.2.0 上启动它,然后它就工作了......

上面的代码逻辑是健全的。仍然需要相同的包:

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Run Code Online (Sandbox Code Playgroud)

Startup.cs 看起来很不同,所以也许如果其他人看到这个,他们可以尝试更新startup.cs 代码:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<DatabaseDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DatabaseDBConnString")));

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Run Code Online (Sandbox Code Playgroud)

为此必须添加对startup.cs的引用:

using Microsoft.EntityFrameworkCore;
Run Code Online (Sandbox Code Playgroud)

这是 AddDbContext 方法需要解决的问题。

完成此操作后,脚手架现在可以工作了。所以它是固定的,但它需要我重新开始来修复它。