簡體   English   中英

無法運行命令。 錯誤:沒有為此 DbContext 配置數據庫提供程序

[英]Unable to run commands. Error: No database provider has been configured for this DbContext

我無法針對我創建的基本 .NET Core 2.2 Web API 運行 EntityFramework Core 命令。 API 正在運行,但除非我更改檢索連接字符串的位置,否則我無法“添加遷移”或“更新數據庫”。 我相信第一個示例是最佳實踐,因為連接字符串更安全,但在嘗試運行 EF Core 命令時出現錯誤。

“尚未為此 DbContext 配置數據庫提供程序。可以通過覆蓋 DbContext.OnConfiguring 方法或在應用程序服務提供程序上使用 AddDbContext 來配置提供程序。如果使用 AddDbContext,則還要確保您的 DbContext 類型接受 DbContextOptions 對象它的構造函數並將其傳遞給 DbContext 的基本構造函數。”

據我所知,我在傳遞 DbContextOptions<> 時正確使用了 AddDbContext()。 唯一的代碼區別在於 Startup.ConfigureServices() 和 MyContext.OnConfiguring()。 我喜歡的例子有什么問題?

首選示例(EF 命令不起作用)

// MyContext.cs
public class MyContext : DbContext
  {
    private readonly DbContextOptions<MyContext> _options;
    private readonly IConfiguration _config;

    public MyContext (DbContextOptions<MyContext> options, IConfiguration config) : base(options)
    {
      _options = options;
      _config = config;
    }

    public DbSet<Account> Accounts { get; set; }
    public DbSet<User> User { get; set; }
  }
}

// Startup.cs
public class Startup
  {
    public IConfiguration Configuration { get; }

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

    public void ConfigureServices(IServiceCollection services)
    {
      services.AddDbContext<MyContext>(
        options => options.UseSqlServer(Configuration.GetConnectionString("MyAPI")));
      services.AddScoped<IMyRepository, MyRepository>();

      services.AddAutoMapper();

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
      if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
      else { app.UseHsts(); }

      //app.UseHttpsRedirection();
      app.UseMvc();
    }
  }

使用下面的代碼,我可以無錯誤地運行“add-migration”和“update-database”,但我相信以這種方式檢索連接字符串的安全性較低。

示例 2(EF 命令工作)

// MyContext.cs
public class MyContext : DbContext
  {
    private readonly DbContextOptions<MyContext> _options;
    private readonly IConfiguration _config;

    public MyContext (DbContextOptions<MyContext> options, IConfiguration config) : base(options)
    {
      _options = options;
      _config = config;
    }

    public DbSet<Account> Accounts { get; set; }
    public DbSet<User> User { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      optionsBuilder.UseSqlServer(_config.GetConnectionString("MyAPI"));
    }
  }
}

// Startup.cs
public class Startup
  {
    public IConfiguration Configuration { get; }

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

    public void ConfigureServices(IServiceCollection services)
    {
      services.AddDbContext<MyContext>();
      services.AddScoped<IMyRepository, MyRepository>();

      services.AddAutoMapper();

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
      if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
      else { app.UseHsts(); }

      //app.UseHttpsRedirection();
      app.UseMvc();
    }
  }

您只需要指定創建數據庫連接的位置。

dotnet ef migrations add SomeMigration --startup-project ../path/to/Api/project

在此示例中,您正在運行遷移命令並指定包含數據庫上下文配置/設置的項目的路徑。 如果不指定此項,並且設置不在 DbContext 類中,則 EF 不知道應如何配置數據庫。

為我解決問題的是更新到 .NET Core 3.1.101 和 EFCore 3.1.1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM