Как внедрить IOptions в DBContext для миграции - PullRequest
0 голосов
/ 17 марта 2020

У меня возникла следующая проблема. Я хочу выполнить миграцию, и поэтому мне нужно использовать конструктор без параметров в моем 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?

...