Проблема:
Команда do tnet ef Migrations add MyNewMigration завершается неудачно с:
Нет поставщика базы данных был настроен для этого DbContext. Поставщик может быть настроен путем переопределения метода DbContext.OnConfiguring или с помощью AddDbContext в поставщике службы приложений. Если используется AddDbContext, то также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его базовому конструктору для DbContext.
Есть много сообщений SO по этой проблеме, и у меня есть прочитайте большинство из них. Здесь, похоже, та же проблема: EF Core не может запускать команды. Ошибка: для этого DbContext
не настроен поставщик базы данных. Однако проблема так и не была решена. Вот некоторые маркеры, которые суммируют расследование вверх и вниз, подробности о шагах.
- Сначала мы просто жестко закодировали строку соединения в методе DbContext OnConfiguring, а затем команда Migrations работала хорошо.
- Затем мы приступили к использованию метода stati c, который считывает файл appsettings. json. Это работало при запуске приложения, но не работало при запуске команды добавления Migrations, поскольку строка подключения, которую мы извлекали из класса stati c, всегда возвращала ноль.
- Затем мы перешли к использованию внедрения зависимости, как и везде везде предлагает делать. в Startup.cs мы используем что-то вроде
services.AddDbContext<MyDbContext>
, а в MyDbContext у нас есть конструктор, такой как public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
. Вызывается конструктор, есть строка подключения, приложение может работать, но Migrations Add завершается неудачно с тем же сообщением об ошибке, что и выше. - Затем я протестировал удаление пустого конструктора по умолчанию, просто сохранив конструктор
MyDbContext(DbContextOptions<MyDbContext> options)
. Сообщение об ошибке команды было тогда « Невозможно создать объект типа« MyDbContext ». » - Поскольку я запускаю команды из моего проекта данных (где лица, 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
выглядит корректно при запуске приложения:
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:
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.