EF Core не может запускать команды. Ошибка: поставщик базы данных не был настроен для этого DbContext - PullRequest
0 голосов
/ 13 марта 2019

Мне не удается выполнить команды EntityFramework Core для базового веб-API .NET Core 2.2, который я создал.API работает, но я не могу «добавить-миграцию» или «обновить-базу данных», пока не изменю место получения строки подключения.Я полагаю, что первый пример является наилучшей практикой, поскольку строка подключения более безопасна, но я получаю сообщение об ошибке при попытке выполнить команды EF Core.

"Для этого не настроен поставщик базы данныхDbContext. Поставщик может быть настроен путем переопределения метода DbContext.OnConfiguring или с помощью AddDbContext в поставщике службы приложения. Если используется AddDbContext, то также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его базовому конструкторудля DbContext. "

Насколько я могу судить, я правильно использовал AddDbContext () при передаче DbContextOptions <>.Единственные различия кода заключаются в 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 -igration» и «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();
    }
  }

1 Ответ

0 голосов
/ 13 марта 2019

Вам просто нужно указать, где создается соединение с БД.

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

В этом примере вы запускаете команду миграции и указываете путь к проекту, который содержит конфигурацию / настройку контекста базы данных. Если вы не укажете это, а настройка не в классе DbContext, то EF не знает, как должна быть сконфигурирована база данных.

...