EF Core 3: CLI «Migrations add» завершается с ошибкой «Поставщик базы данных не настроен для этого DbContext» - PullRequest
1 голос
/ 26 февраля 2020

Проблема:

Команда do tnet ef Migrations add MyNewMigration завершается неудачно с:

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

Есть много сообщений SO по этой проблеме, и у меня есть прочитайте большинство из них. Здесь, похоже, та же проблема: EF Core не может запускать команды. Ошибка: для этого DbContext

не настроен поставщик базы данных. Однако проблема так и не была решена. Вот некоторые маркеры, которые суммируют расследование вверх и вниз, подробности о шагах.

  1. Сначала мы просто жестко закодировали строку соединения в методе DbContext OnConfiguring, а затем команда Migrations работала хорошо.
  2. Затем мы приступили к использованию метода stati c, который считывает файл appsettings. json. Это работало при запуске приложения, но не работало при запуске команды добавления Migrations, поскольку строка подключения, которую мы извлекали из класса stati c, всегда возвращала ноль.
  3. Затем мы перешли к использованию внедрения зависимости, как и везде везде предлагает делать. в Startup.cs мы используем что-то вроде services.AddDbContext<MyDbContext>, а в MyDbContext у нас есть конструктор, такой как public MyDbContext(DbContextOptions<MyDbContext> options) : base(options). Вызывается конструктор, есть строка подключения, приложение может работать, но Migrations Add завершается неудачно с тем же сообщением об ошибке, что и выше.
  4. Затем я протестировал удаление пустого конструктора по умолчанию, просто сохранив конструктор MyDbContext(DbContextOptions<MyDbContext> options). Сообщение об ошибке команды было тогда « Невозможно создать объект типа« MyDbContext ». »
  5. Поскольку я запускаю команды из моего проекта данных (где лица, dbcontext et c существует), я попытался добавить в команду путь запуска, например dotnet ef Migrations add MyMigrationStuff --startup-project C:\Git\MyProject\MyProject.Api, но без конструктора default / empty. На этот раз сообщение об ошибке было просто Build failed. Затем я восстановил пустой конструктор и снова выполнил ту же команду: затем я получил ту же ошибку, что и выше.

Startup.cs

   public void ConfigureServices(IServiceCollection services)
    {
        // ... other stuff

        string cString = configuration["ConnectionStrings:MyDb"]; // cString is correct and valid!
        services.AddDbContext<MyDbContext>(options => options.UseMySql(cString, mySqlOptions => mySqlOptions
                .ServerVersion(new ServerVersion(new Version(5, 0, 17), ServerType.MySql))));
        // services.AddDbContext<MyDbContext>(); // without DI as in case 1 and 2 above
    }

cString выглядит корректно при запуске приложения: enter image description here

MyDbContext:

public class MyDbContext : DbContext
{
    // DbSet etc...

    public MyDbContext() : base()
    {
    }

    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
        // If I break here, the options has two Extensions, looks ok, see below.
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    }
 }

Это options в MyDbConstructor: enter image description here

appsettings. json

{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  },
  "ConnectionStrings": {
    "MyDb": "Server=localhost;Port=3308;Database=mydb;User=root;Password=root;"
  }
}

Я работаю ASP. NET Core 3.1.101, EF Core 3.1.1, visual studio 2019.

1 Ответ

1 голос
/ 26 февраля 2020

вам нужно установить MySQL провайдера, используя этот cmd:

dotnet add package MySql.Data.EntityFrameworkCore

, затем добавить этот код в конструктор класса DBContext:

protected override void OnConfiguring(DbContextOptionsBuilder options)
{
  options.UseMySQL(Configuration.GetConnectionString("MyDb"));
}

и, наконец, добавить эту строку в ваш класс startup.cs вместо того, что вы положили:

services.AddDbContext<MyDbContext>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...