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

2024-01-06

我无法针对我创建的基本 .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 不知道应如何配置数据库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法运行命令。错误:尚未为此 DbContext 配置数据库提供程序 的相关文章

随机推荐