У меня возникла следующая проблема. Я хочу выполнить миграцию, и поэтому мне нужно использовать конструктор без параметров в моем DBConext
, иначе я получаю ошибку "can not create object of type DBContext"
.
Как только я добавляю конструктор без параметров Я получаю сообщение об ошибке:
Для этого DbContext не настроен поставщик базы данных. Поставщик может быть настроен путем переопределения метода DbContext.OnConfiguring или с помощью AddDbContext в поставщике службы приложений. Если используется AddDbContext, то также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его базовому конструктору для DbContext.
Теперь перед использованием миграций я создавал свой DBContext
в своем методе Startup.ConfigureServices
, в который я вставлял бы его строку подключения.
Теперь мой код работает нормально, когда я не выдаю Команды миграции:
Контекст
public class SXSContext : DbContext {
public DbSet<[something]> SomeTable{ get; set; }
public SXSContext()
{
}
public SXSContext(DbContextOptions<SXSContext> options):base(options) {
}
}
Программа
public static void Main(string[] args) {
var host = BuildWebHost(args);
CreateIfNotExists(host);
host.Run();
}
public static void CreateIfNotExists(IWebHost host) {
using (var scope = host.Services.CreateScope()) {
var services = scope.ServiceProvider;
try {
var context = services.GetRequiredService<SXSContext>();
context.Database.EnsureCreated();
} catch (Exception ex) {
throw;
}
}DBB
}
Startup.ConfigureServices
Config config = this.Configuration.GetSection("config").Get<Config>();
services.AddDbContext<SXSContext>(x =>
x.UseSqlServer(sqlConString);
Теперь, после исследования, я обнаружил, что для миграций мне нужно было бы перегрузить DBContext.OnConfiguring
и использовать что-то вроде:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(constring);
}
}
Как мне взять IOptions
и использовать его для настройки ny DBContext
в методе DBContext.OnConfiguring
?