无法运行命令。错误:此 DbContext 尚未配置任何数据库提供程序。

3
我无法对我创建的基本.NET Core 2.2 Web API 运行 EntityFramework Core 命令。API正在工作,但是如果我不更改连接字符串的检索位置,我将无法执行“add-migration”或“update-database”。我认为第一个示例是最佳实践,因为连接字符串更安全,但是当我尝试运行EF Core命令时会出现错误。
引用:"此DbContext尚未配置数据库提供程序。可以通过覆盖DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。如果使用AddDbContext,则还要确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基础构造函数。"
据我所知,我已正确使用了 AddDbContext() 并传递了 DbContextOptions<>。 在 Startup.ConfigureServices() 和 MyContext.OnConfiguring() 中唯一的代码差异在于什么?我的首选示例有什么问题吗?
// 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();
    }
  }

这个问题从来没有解决过吗? - Ted
这个项目是一个我已经有一段时间没有碰过的概念验证。看起来问题已经解决了。我可以使用示例1并成功运行EntityFramework命令。我已经删除了我在唯一答案上最后一条评论中提到的代码(只有在optionsBuilder.IsConfigured = false时才在OnConfiguring()中运行.UseSqlServer())。我正在Visual Studio 19中运行dotnetcore 3.1.101和EFCore 3.1.1。 - WoodmanBlockerville
1
我在2019年5月之前无法访问我的版本控制,所以据我所知,唯一真正发生变化的是我从dotnetcore 2.2切换到了3. - WoodmanBlockerville
2个回答

1
更新到.NET Core 3.1.101和EFCore 3.1.1解决了我的问题。

1

您只需要指定创建数据库连接的位置即可。

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

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

当我执行 dotnet ef migrations add Testing2 --startup-project C:\path\to\Api\project\ 时,我遇到了相同的错误。如果我发布堆栈跟踪信息,是否有帮助? - WoodmanBlockerville
你还应该从与持久化项目相同的目录中运行命令。所以,如果你有一个名为Data的项目和一个名为API的项目,在Data目录中运行命令,并在--startup-project标志中提供API项目的相对或绝对路径。 - emagers
我有一个项目,其中包含我的控制器和数据。我已经从项目文件夹本身以及项目内的数据文件夹中运行了这个命令,每次都针对我的项目的绝对路径设置了 --startup-project 标志。但是我一直得到相同的初始错误。 - WoodmanBlockerville
目前,我已经添加了一个 IF 代码块到 OnConfiguring() 方法中,只有在 optionsBuilder.IsConfigured = false 的情况下才会执行 .UseSqlServer() 方法。if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(_config.GetConnectionString("ScanAPI")); } - WoodmanBlockerville

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接