EF Core无法运行命令。错误:尚未为此DbContext配置数据库提供商

时间:2019-03-13 13:40:06

标签: c# entity-framework asp.net-core entity-framework-core .net-core-2.2

我无法针对我创建的基本.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();
    }
  }

2 个答案:

答案 0 :(得分:1)

对我来说,解决此问题的原因是更新到.NET Core 3.1.101和EFCore 3.1.1。

答案 1 :(得分:0)

您只需要指定在何处创建数据库连接。

Axes.tick_params

在此示例中,您正在运行迁移命令,并指定包含数据库上下文的配置/设置的项目路径。如果您未指定此选项,并且设置不在DbContext类中,则EF不知道应如何配置数据库。